为什么负面枚举成员最后被foreach枚举?

gml*_*ojr 12 c# enums

在C#中,如果我们定义一个enum包含对应于负值的成员,然后我们迭代它enum的值,那么负值不是第一个,而是最后一个.为什么会这样?在其他语言(C,C++,Ada等)中,迭代a enum将为您提供定义它的顺序.

MSDN 就是这种行为的一个很好的例子:

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
Run Code Online (Sandbox Code Playgroud)

Aak*_*shM 16

您链接到的文档页面,我的重点:

数组的元素按枚举常量的二进制值(即无符号幅度)进行排序.

深入研究CLR代码(2.0 SSCLI)并获得远低于我真正感觉到的水平,看起来最终这是因为内部枚举值存储在看起来像这样的东西中(注意这是C++):

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;
Run Code Online (Sandbox Code Playgroud)

可以看出,它是包含实际值的无符号类型 - 因此,当枚举时发出这些值时,它们自然处于无符号顺序.

  • 有趣的是,这开始是一个错误(http://connect.microsoft.com/VisualStudio/feedback/details/98147/enum-getvalues).如果您在3.5之前查看文档的早期版本,则没有官方提及它使用了无符号量值.由于无法在不破坏现有应用程序的情况下修复它,我猜他们只是更新了文档:D (8认同)