为什么enum . tostring()没有返回正确的enum名称?

本文关键字:enum 名称 返回 tostring 为什么 | 更新日期: 2023-09-27 18:02:32

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

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

下面是枚举定义的一个片段(由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名称空间的一部分)

为什么enum . tostring()没有返回正确的enum名称?

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

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

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

一旦您解决了引用两个不同版本的原因并将其统一为一个汇编版本,Enum.ToString()结果应该如您所期望的那样。

我建议探查:

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

等等