C# GetNames()以意外的顺序生成负枚举常量
我有以下枚举定义(用C#): 现在,当我对这个类型执行C# GetNames()以意外的顺序生成负枚举常量,c#,.net,enums,C#,.net,Enums,我有以下枚举定义(用C#): 现在,当我对这个类型执行Enum.GetNames()时,我得到了一个包含9个元素的字符串数组,但顺序是All,Trace,走开,将军,这不是我所期望的 以下是Enum.GetNames()的MSDN: 备注:返回值数组的元素按 枚举常量的值。” 这是怎么回事?我可以更改我的程序以考虑这一“功能”,但我想知道.NET为什么要这样做。根据排序的方式,它可能会像无符号一样对值进行排序,在这种情况下,-1=0xffffffff,当然大于7。这是一个已知的bug,报告了Ge
Enum.GetNames()
时,我得到了一个包含9个元素的字符串数组,但顺序是All,Trace,走开,将军,这不是我所期望的
以下是Enum.GetNames()的MSDN
:
备注:返回值数组的元素按
枚举常量的值。”
这是怎么回事?我可以更改我的程序以考虑这一“功能”,但我想知道.NET为什么要这样做。根据排序的方式,它可能会像无符号一样对值进行排序,在这种情况下,-1=0xffffffff,当然大于7。这是一个已知的bug,报告了
GetNames()
和GetValues()
,但最终关闭了,因为无法修复:
是的,此方法确实存在一个错误,它返回按无符号类型排序的枚举值数组(-2是0xFFFFFE,-1是0xFFFFFF,以2的补码表示,这就是它们显示在列表末尾的原因),而不是返回按有符号类型排序的值
不幸的是,我们无法更改GetValues的排序顺序,因为我们将中断所有已编写为依赖于当前排序行为的现有.NET程序[…]
看起来您必须自己重新排序这些值。我建议您向Microsoft提交一份错误报告。它不再是一个错误,而是一个功能:“数组的元素按枚举常量的二进制值排序(即,按其无符号的大小)。”这当然是可能的,而且似乎可以解释问题,但考虑到
enum
的默认底层类型是int
,这肯定会很奇怪。下面BoltClock的回答似乎证实了我的猜测。“已编写的依赖于当前排序行为的现有.NET程序”这就是为什么你不纠缠于实现细节。当然,如果实现总是以这种方式被破坏,那么MS更新文档以使其符合实际行为是有意义的。@LukeH:没错。就连臭虫记者也说了同样的话。@LukeH:。数组元素按枚举常数的二进制值(即,按其无符号大小)排序
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
}