2

私が作成した列挙型は次のようになります。

enum MonthOfTheYear : byte
{
    January,
    February,
    March,
    April,
    May,
    June,
    July = 0,
    August,
    September,
    October,
    November,
    December
}

ご覧のとおり、July には 0 の初期化子があります。これには、いくつかの興味深い (副作用) 効果があります。整数値の「ペアリング」があるようです。2 月と 8 月の値は 1 になり、3 月と 9 月の値は 2 になります。

MonthOfTheYear theMonth = MonthOfTheYear.February;
Console.WriteLine(theMonth + " has integer value of " + (int)theMonth);

MonthOfTheYear theMonth = MonthOfTheYear.August;
Console.WriteLine(theMonth + " has integer value of " + (int)theMonth);

これを明確に示します。これまでのところ、私がそれを見つけるのは奇妙ですが、私は喜んで一緒に行きます. 編集: July 0 を割り当てると、インデックスが最初からやり直されます。同じ列挙型内で共存できる理由がわかりません。

しかし!次に、列挙型をループして、基になるすべての整数値を出力すると、奇妙なことが起こります。

MonthOfTheYear theMonth = MonthOfTheYear.January;

for (int i = 0; i < 12; i++)
{
    Console.WriteLine(theMonth + " has integer value of " + (int)theMonth++);
}

出力

July has integer value of 0
February has integer value of 1
September has integer value of 2
April has integer value of 3
May has integer value of 4
June has integer value of 5
6 has integer value of 6
7 has integer value of 7
8 has integer value of 8
9 has integer value of 9
10 has integer value of 10
11 has integer value of 11

整数値が連続しているため、舞台裏で何が起こっているのか誰かが説明してくれることを期待していたので、これは期待どおりに出力されていると思いますが、まだ見ていません。

4

4 に答える 4

5

まず、列挙型の定義で値を指定すると、後続の値はそこから連続して番号付けされます。0また、どこかで指定した場合でも、最初の値は から番号付けされ0ます。したがって、あなたの根底にあるbyte価値は次のとおりです。

enum MonthOfTheYear : byte
{
    January = 0, // not specified, so starts at 0
    February = 1,
    March = 2,
    April = 3,
    May = 4,
    June = 5,
    July = 0, // specified, so starts numbering from 0 again
    August = 1,
    September = 2,
    October = 3,
    November = 4,
    December = 5
}

で列挙値を++インクリメントすると、基になる値がインクリメントされるだけですbyte-の定義を見て、次の行の要素に移動しませんenum!

これbyteに対応する定義済みのエントリがない場合でも、それがまったく無効であることを意味するわけではありません。つまり、列挙値を文字列に変換すると、byte値が文字列として取得されます。

byteに対応する定義済みのエントリが複数ある場合...実際には、文字列に変換するとどのエントリが得られるか正確にはわかりませんが、必ずしも最初のエントリであるとは限りません。

基本的にMonthOfTheYear.February == MonthOfTheYear.August、それを呼び出しToStringている場合でも、デバッガーで見ている場合でも、一方が他方に切り替えられないという保証はありません。

于 2013-01-18T12:47:46.923 に答える
1

http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx

複数の列挙メンバーが同じ基になる値を持つ場合、GetName メソッドは、それらの列挙メンバーの 1 つの名前を返すことを保証します。ただし、常に同じ列挙メンバーの名前が返されるとは限りません。その結果、複数の列挙メンバーが同じ値を持つ場合、アプリケーション コードは、特定のメンバーの名前を返すメソッドに依存するべきではありません。

要約すると、同じ値を持つ複数のメンバーがある場合、特定の値に対して取得される名前は、その値を持つメンバーのいずれかになります

于 2013-01-18T12:59:01.413 に答える
1

メソッドを使用する

Enum.GetName

次に例を示します。

using System;

public class GetNameTest {
    enum Colors { Red, Green, Blue, Yellow };
    enum Styles { Plaid, Striped, Tartan, Corduroy };

    public static void Main() {

        Console.WriteLine("The 4th value of the Colors Enum is {0}", Enum.GetName(typeof(Colors), 3));
        Console.WriteLine("The 4th value of the Styles Enum is {0}", Enum.GetName(typeof(Styles), 3));
    }
}
// The example displays the following output:
//       The 4th value of the Colors Enum is Yellow
// 

ここに完全な説明があります:

http://msdn.microsoft.com/de-de/library/system.enum.getname.aspx

于 2013-01-18T12:46:26.253 に答える
0

列挙型の最初の月に 7 月を明示的に設定します。これは物事を台無しにします。これを試して:

enum MonthOfTheYear : byte {
        January,
        February,
        March,
        April,
        May,
        June,
        July,
        August,
        September,
        October,
        November,
        December
    }

for (int i = 0; i < 12; i++) {
    Console.WriteLine(String.Format("{0} has integer value of {1}", Enum.GetName(typeof(MonthOfTheYear), i), i));
}

july をゼロに設定したため、その時点からインデクサーがリセットされます。この奇妙な順序を設定したい場合は、列挙型で順序を再配置することを検討してください。

于 2013-01-18T12:52:33.767 に答える