加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么Enum.ToString()没有返回正确的枚举名称?

发布时间:2020-12-15 08:44:55 所属栏目:百科 来源:网络整理
导读:我正在使用具有枚举的外部库.这个枚举的一些成员,当你在它们上调用ToString()时,返回枚举的不同成员的名称. Console.WriteLine("TOKEN_RIGHT = {0}",Tokens.TOKEN_RIGHT.ToString()); //prints TOKEN_OUTERConsole.WriteLine("TOKEN_FROM = {0}",Tokens.TOKE
我正在使用具有枚举的外部库.这个枚举的一些成员,当你在它们上调用ToString()时,返回枚举的不同成员的名称.
Console.WriteLine("TOKEN_RIGHT = {0}",Tokens.TOKEN_RIGHT.ToString());  //prints TOKEN_OUTER
Console.WriteLine("TOKEN_FROM = {0}",Tokens.TOKEN_FROM.ToString());  //prints TOKEN_FROM
Console.WriteLine("TOKEN_OUTER = {0}",Tokens.TOKEN_OUTER.ToString());  //prints TOKEN_FULL

我知道当两个枚举成员具有相同的数值时,你可以得到这样的行为,但我知道,从反编译和检查运行时的值,枚举中的每个成员都有一个唯一的值.

这是enum定义的片段(由dotPeek生成):

public enum Tokens
{

    TOKEN_OR = 134,TOKEN_AND = 135,TOKEN_NOT = 136,TOKEN_DOUBLECOLON = 137,TOKEN_ELSE = 138,TOKEN_WITH = 139,TOKEN_WITH_CHECK = 140,TOKEN_GRANT = 141,TOKEN_CREATE = 142,TOKEN_DENY = 143,TOKEN_DROP = 144,TOKEN_ADD = 145,TOKEN_SET = 146,TOKEN_REVOKE = 147,TOKEN_CROSS = 148,TOKEN_FULL = 149,TOKEN_INNER = 150,TOKEN_OUTER = 151,TOKEN_LEFT = 152,TOKEN_RIGHT = 153,TOKEN_UNION = 154,TOKEN_JOIN = 155,TOKEN_PIVOT = 156,TOKEN_UNPIVOT = 157,TOKEN_FROM = 242,}

为什么会这样?有什么我做错了,或者这只是.NET中那些有趣的枚举怪癖之一?如果是后者,是否有解决方法?

(对于它的价值,Tokens是.NET中Microsoft.SqlServer.Management.SqlParser.Parser命名空间的一部分.)

解决方法

您正在查看两个不同版本的程序集.

您的代码(在设计/编译时)引用了一个较新的版本(因为当您使用dotPeek检查DLL时,您可以使用TOKEN_FROM,但它不存在).但是,在运行时加载的程序集是具有不同基础值的旧版本,因此名称不匹配.

您将不得不调查它是如何引用不匹配的DLL的.它可能是执行机器上安装的框架,或者您可能在相同的解决方案中引用了不同版本的项目,或者可能是其他原因(无法根据您提供的信息确定).

一旦解决了为什么引用两个不同版本并将其统一到单个程序集版本,Enum.ToString()结果应该如您所愿.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读