我正在使用具有枚举的外部库.这个枚举中有一些成员,当你调用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
Run Code Online (Sandbox Code Playgroud)
我知道当两个枚举成员具有相同的数值时,你可以得到这样的行为,但我知道,从反编译和检查运行时的值,枚举中的每个成员都有一个唯一的值.
这是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,
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有什么我做错了,或者这只是.NET中那些有趣的枚举怪癖之一?如果是后者,是否有解决方法?
(对于它的价值,它Tokens是.NET中Microsoft.SqlServer.Management.SqlParser.Parser命名空间的一部分.)
您正在查看两个不同版本的程序集.
您的代码(在设计/编译时)引用了一个较新的版本(因为您可以在使用TOKEN_FROMdotPeek检查DLL时使用它,但它不存在).但是,在运行时加载的程序集是具有不同基础值的旧版本,因此名称不匹配.
您将不得不调查它是如何引用不匹配的DLL的.它可能是执行机器上安装的框架,或者您可能在相同的解决方案中引用了不同版本的项目,或者可能是其他原因(无法根据您提供的信息确定).
一旦解决了为什么引用两个不同版本并将其统一到单个程序集版本,Enum.ToString()结果应该如您所愿.
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |