【问题标题】:Enum.GetNames() results in unexpected order with negative enum constantsEnum.GetNames() 导致带有负枚举常量的意外顺序
【发布时间】:2011-07-25 16:31:33
【问题描述】:

我有以下枚举定义(在 C# 中):

public enum ELogLevel
{
    General = -1,  // Should only be used in drop-down box in Merlinia Administrator log settings
    All = 0,       // Should not be used as a level, only as a threshold, effectively same as Trace
    Trace = 1,
    Debug = 2,
    Info = 3,
    Warn = 4,
    Error = 5,
    Fatal = 6,
    Off = 7        // Should not be used as a level, only as a threshold
}

现在,当我对这种类型执行 Enum.GetNames() 时,我得到了一个包含 9 个元素的字符串数组,但顺序是 All、Trace、...、Off、General,这不是我所期望的。

这是 Enum.GetNames() 的 MSDN documentation

"备注:返回值数组的元素按 枚举常量的值。”

这里发生了什么?我可以更改我的程序以将这种“功能”考虑在内,但我有点想知道为什么 .NET 正在做它正在做的事情。

【问题讨论】:

  • 我建议向 Microsoft 提交错误报告。
  • 这不再是一个错误,它是now documented 的一个特性:“数组的元素按枚举常量的二进制值排序(即按它们的无符号大小)。”

标签: c# .net enums


【解决方案1】:

这是GetNames()GetValues() 的一个已知错误,已报告here,但由于无法修复而最终关闭:

是的,这个方法确实有一个错误,它返回按无符号类型排序的枚举值数组(-2 是 0xFFFFFFFE,-1 是二进制补码中的 0xFFFFFFFF,这就是它们出现在列表末尾的原因) 而不是返回按其有符号类型排序的值。

不幸的是,我们无法更改 GetValues 的排序顺序,因为我们将破坏所有现有的已编写为依赖于当前排序行为的 .NET 程序 [...]

看来您必须自己重新排序这些值。

【讨论】:

  • “根据当前排序行为编写的现有 .NET 程序”这就是为什么您不关注实现细节的原因。
  • 当然,如果实现总是一直存在并且总是会以这种方式被破坏,那么 MS 更新文档以使其与实际行为相匹配是有意义的。
  • @LukeH:没错。甚至错误报告者也这么说。
  • @LukeH:They eventually did。 “数组的元素按枚举常量的二进制值排序(即按它们的无符号大小)。”
【解决方案2】:

根据排序的方式,可能会将值排序为无符号数,在这种情况下,-1 = 0xffffffff,当然大于 7。

【讨论】:

  • 这当然是可能的,而且它似乎可以解释一些事情,但考虑到enum 的默认底层类型是int,这肯定会很奇怪。
  • 下面BoltClock的回答似乎证实了我的猜测。
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多