Enum.GetNames()导致具有负枚举常量的意外顺序

我有以下枚举定义(在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 文档 :

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

这里发生了什么? 我可以改变我的程序来考虑这个“function”,但我想知道为什么.NET正在做它正在做的事情。

这是一个已知的错误,同时报告了GetNames()GetValues() ,但最终因为无法修复而关闭:

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

不幸的是,我们无法更改GetValues的排序顺序,因为我们将打破所有已编写的.NET程序,这取决于当前的排序行为[…]

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

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