12

C# では、負の値に対応するメンバーを含む を定義し、enumその値を反復処理するとenum、負の値は最初ではなく最後になります。なぜそれが起こるのですか?他の言語 (C、C++、Ada など) では、 an を反復する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
4

1 に答える 1

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;

ご覧のとおり、実際の値を保持するのは符号なしの型です。したがって、これらの値が列挙のために発行される場合、当然、符号なしの順序になります。

于 2013-08-09T14:12:01.413 に答える