Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetNames()以意外的顺序生成负枚举常量_C#_.net_Enums - Fatal编程技术网

C# GetNames()以意外的顺序生成负枚举常量

C# GetNames()以意外的顺序生成负枚举常量,c#,.net,enums,C#,.net,Enums,我有以下枚举定义(用C#): 现在,当我对这个类型执行Enum.GetNames()时,我得到了一个包含9个元素的字符串数组,但顺序是All,Trace,走开,将军,这不是我所期望的 以下是Enum.GetNames()的MSDN: 备注:返回值数组的元素按 枚举常量的值。” 这是怎么回事?我可以更改我的程序以考虑这一“功能”,但我想知道.NET为什么要这样做。根据排序的方式,它可能会像无符号一样对值进行排序,在这种情况下,-1=0xffffffff,当然大于7。这是一个已知的bug,报告了Ge

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

现在,当我对这个类型执行
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
}