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

标签 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

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

这是枚举定义的片段(由 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 中枚举的另一个有趣怪癖?如果是后者,是否有解决方法?

(就其值(value)而言,Tokens 是 .NET 中 Microsoft.SqlServer.Management.SqlParser.Parser 命名空间的一部分。)

最佳答案

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

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

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

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

关于c# - 为什么 Enum.ToString() 不返回正确的枚举名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23550937/

相关文章:

c++ - 动态访问 union

c# - 如何避免 UI 因调用而挂起?

.net - 停止 .NET Firebird (2.6.5) 提供程序将所有 SQL 写入控制台

c# - IDisposable.Dispose() 实现应该是幂等的吗?

java - 枚举,增强的 for 循环

c# - 更新和扩展枚举 C#

c# - 从长字符串中获取分隔符以进行拆分

c# - 在不使用接口(interface)的情况下删除冗余的 C# 代码

c# - 确定哪个控件导致 PostBack

c# - 查询时丢失对子对象的引用