3

CLR はどのカラー ゼロを変換する必要があるかをどのように判断しますか?

internal static class Test
{
    private static void Main()
    {
        Console.WriteLine((Color)0);
    }

    private enum Color
    {
        Red,
        Green = Red
    }
}

この Color の定義を使用すると、「赤」が出力されます。

他の定義を使用すると、結果は非常に興味深いものになります。

private enum Color
{
    Red,
    Green = Red,
    Blue = Red,
    Yellow = Red
}

出力は「緑」です。

別の定義:

private enum Color
{
    Red,
    Green = Red,
    Blue,
    Yellow  = Red
}

出力は「黄色」です。

4

4 に答える 4

6

基になる値が 0 の値を返すだけです。これは、 and とColor同じ値です。Color.RedColor.Green

基本的に、列挙型は壊れてRedおりGreen、同じ値です。それらをまったく区別することはできません。

Color red = Color.Red;
Color green = Color.Green;
Console.WriteLine(red == green); // True
Console.WriteLine(red.ToString() == green.ToString()); // True

ToString「赤」または「緑」を返すかどうかについて保証があるかどうかはわかりませんが、それが関連する状況になった場合は、列挙型を別の方法で記述すべきでした。

編集:ドキュメントから:

複数の列挙型メンバーが同じ基になる値を持ち、その基になる値に基づいて列挙型メンバーの名前の文字列表現を取得しようとする場合、メソッドが返す名前についてコードで仮定を行うべきではありません。たとえば、次の列挙は、同じ基になる値を持つ 2 つのメンバー Shade.Gray と Shade.Grey を定義します。

...

次のメソッド呼び出しは、基礎となる値が 1 である Shade 列挙のメンバーの名前を取得しようとします。このメソッドは、"Gray" または "Grey" を返すことができます。コードでは、どの文字列が返されるかについて何も仮定しないでください。

于 2012-07-21T08:14:57.357 に答える
1

.net の各 enum 変数は整数値にマップされるため、どのタイプを返すかを知ることができます。

MSDN-enum (C# リファレンス)

The default underlying type of the enumeration elements is int. By default, the
first enumerator has the value 0, and the value of each successive enumerator is 
 increased by 1.
于 2012-07-21T08:16:51.210 に答える
1

このようなものに対する答えは - 未定義です。答えがバージョンごとに、またはマシンごとに変わることがあります (可能性は低いです)。質問は興味深いものですが、このような状況で生成される特定の回答に決して依存しないでください。あなたがやろうとしていることについて、他にもたくさんの方法があります。

お気に入り:

 private enum MainColor
    {
        Red,
        Green, 
        Blue, 
    }

   private enum Color
   {
        Red = MainColor.Red,
        Green = MainColor.Green, 
        Blue = MainColor.Blue, 
        Brown = MainColor.Red, 
   }

その後、MainColor にキャストして、決定的な答えを得ることができます。

ある種のハッシュされたリストに基づいて最初に一致するものを見つけようとしているように私には思えます。詳細はコードにとって重要ではありません。

于 2012-07-21T22:15:10.477 に答える
0

列挙型の代わりにこれを試してください:

    private enum Color
    {  
         Red,
         Green,BLUE,black,brown = Red,gray  
    }

観察:

1) (Color)0 : Red  
2) (Color)1 : Green   
3) (Color)2 : BLUE  
4) (Color)3 : black  

そのため、CLR は enum に含まれる順序で取得します。

于 2012-07-21T08:32:56.860 に答える