为什么foreach最后枚举了负枚举成员

本文关键字:枚举成员 枚举 foreach 最后 为什么 | 更新日期: 2023-09-27 18:27:06

在C#中,如果我们定义一个包含与负值对应的成员的enum,然后迭代该enum的值,则负值不会排在第一位,而是排在最后。为什么会发生这种情况?在其他语言(C、C++、Ada等)中,对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

为什么foreach最后枚举了负枚举成员

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

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

深入研究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;

可以看出,持有实际值的是unsigned类型,因此当这些值被发出用于枚举时,它们自然按照signed