C# 为什么foreach最后枚举负枚举成员?

C# 为什么foreach最后枚举负枚举成员?,c#,enums,C#,Enums,在C#中,如果我们定义一个enum,其中包含一个与负值相对应的成员,然后我们迭代该enum的值,则负值不会排在第一位,而是排在最后。为什么会这样?在其他语言(C、C++、艾达等)中,通过枚举> /Cord>将给出定义的顺序。 MSDN有一个很好的功能: 我的重点是: 数组的元素按枚举常量的二进制值排序(即,按其无符号大小排序) 深入研究CLR代码(2.0 SSCLI)并获得远低于我所能接受的级别,看起来最终这是因为内部枚举值存储在如下内容中(注意,这是C++): 可以看出,保存实际值的是无符号类

在C#中,如果我们定义一个
enum
,其中包含一个与负值相对应的成员,然后我们迭代该
enum
的值,则负值不会排在第一位,而是排在最后。为什么会这样?在其他语言(C、C++、艾达等)中,通过<代码>枚举> /Cord>将给出定义的顺序。 MSDN有一个很好的功能:

我的重点是:

数组的元素按枚举常量的二进制值排序(即,按其无符号大小排序)

深入研究CLR代码(2.0 SSCLI)并获得远低于我所能接受的级别,看起来最终这是因为内部枚举值存储在如下内容中(注意,这是C++):


可以看出,保存实际值的是无符号类型-因此,当这些值为枚举而发出时,它们自然是按无符号顺序排列的。

它可能被排序为无符号。您是通过对文档进行修改来实现的。下一次,请阅读同一篇文章:“数组的元素按枚举常量的二进制值(即,按其无符号大小)排序。”“数组的元素按枚举常量的二进制值(即,按其无符号大小)排序。”我想知道
enum
s的声明顺序是否无关紧要,是否没有被保留?@gmletzkojr:我没有试图侮辱你。事实上,我赞扬你至少检查了文档,然后我直截了当地提出了建议,这可以避免你浪费自己的时间。我真的很抱歉你觉得受到了侮辱,我的评论非常直率,但这不是我的本意。有趣的是,这是从一个bug()开始的。如果您查看3.5之前的早期版本的文档,并没有官方提到它使用了未签名的幅值。由于无法在不破坏现有应用程序的情况下修复它,我想他们只是更新了文档:DThanks@keyboardP,这就是我真正想问的。回答得好。但是,它假设读者知道负数是如何表示的(事实上,虽然没有明确要求使用此方法表示有符号整数)。这些知识对于理解为什么将它们视为无符号会使它们跟随正数是必要的。
using System;

enum SignMagnitude { Negative = -1, Zero = 0, Positive = 1 };

public class Example
{
    public static void Main()
    {
        foreach (var value in Enum.GetValues(typeof(SignMagnitude)))
        {
            Console.WriteLine("{0,3}     0x{0:X8}     {1}",
                              (int) value, ((SignMagnitude) value));
        }   
    }
}

// The example displays the following output: 
//         0     0x00000000     Zero 
//         1     0x00000001     Positive 
//        -1     0xFFFFFFFF     Negative
class EnumEEClass : public EEClass
{
    friend class EEClass;

 private:

    DWORD           m_countPlusOne; // biased by 1 so zero can be used as uninit flag
    union
    {
        void        *m_values;
        BYTE        *m_byteValues;
        USHORT      *m_shortValues;
        UINT        *m_intValues;
        UINT64      *m_longValues;
    };
    LPCUTF8         *m_names;