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

时间:2014-05-08 19:35:09

标签: c# .net enums

我正在使用具有枚举的外部库。这个枚举的一些成员,当你在它们上面调用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

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

这是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命名空间的一部分。)

2 个答案:

答案 0 :(得分:5)

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

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

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

一旦您解决了为什么您引用了两个不同的版本并将其统一到一个程序集版本,Enum.ToString()结果应该符合您的预期。

答案 1 :(得分:1)

我建议探测:

Console.WriteLine("TOKEN_RIGHT = {0}", Tokens.TOKEN_RIGHT.ToString("F"));

等等