列挙型宣言の複数の値: CLR の詳細
構造体とは異なり、列挙型はセットを表す軽量の値型として分類されます。名前付き定数の。ただし、質問が示しているのは、列挙型を使用すると、複数の値を同じ定数に割り当てることができるようだという興味深い観察です。
共通言語ランタイム (CLR) の実装の詳細を詳しく調べると、列挙型が次のことを行うことが明らかになります。基本的に構造体と似ています。舞台裏では、列挙型は System.Enum 基本クラスから派生し、本質的に事前定義された定数値を持つ構造体です。
列挙型宣言の例を考えてみましょう。
public enum Color { Red = 1, Blue = 1, Green = 1 }
CLR は、この宣言を内部的に次のように解釈します。 :
public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; }
C# では構造体の明示的な基本クラス宣言を禁止していますが、CLR ではそれでも、列挙型に対してこの表現が生成されます。
列挙型に同じ値を持つ複数の定数が存在しても、問題は発生しません。ただし、この非一意な値の割り当てにより、列挙型への変換中に予期しない動作が発生する可能性があります。
例:
Color color1 = (Color)1; Color color2 = (Color)Enum.Parse(typeof(Color), "1");
color1 と color2 は両方とも Red 値に設定されます。最初の値の割り当ては任意です。技術的には、color1 にも color2 にも赤は割り当てられません。むしろ、値 1 が保持されます。しかし、表示されると、赤色が表示されます。
さらに、一意でない列挙値間の比較演算により、驚くべき結果が生じる可能性があります:
// true (Red is Green??) bool b = Color.Red == Color.Green;
赤と緑の両方の基礎となる数値が 1 であるため、この等価性は当てはまります。
この動作には本質的に問題はありませんが、次のような場合には考慮する必要があります。一意でない値を持つ列挙型を使用します。この非一意性が列挙型設計の意図された目的およびセマンティクスと一致しているかどうかを判断することが重要です。
以上がC# の列挙型は同じ基底定数を持つ複数の値を保持できますか?またその影響は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。