一意でない列挙値の謎を明らかにする
EDI ファイル内のインデックス位置を難読化しようとしたときに、驚くべき発見が行われました。同じ列挙型に複数の値を割り当てる機能。この一見異常な動作は、その背後にあるロジックとその潜在的な影響について疑問を引き起こしています。
Enum は、本質的には System.Enum を継承する構造体であることがわかります。バックグラウンドでは、列挙値は定数として定義されます。たとえば、次の enum 定義:
public enum Color { Red = 1, Blue = 1, Green = 1 }
は、実質的に次の疑似コードと同等です:
public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; }
これは、enum が本質的に同じ定数のコレクションであることを明らかにします。根底にある価値観。 C# では、明示的な基本クラスを使用して構造体を定義することは禁止されていますが、これはまさに enum 定義に変換されるものです。
その結果、同じ値を持つ複数の定数を 1 つのクラスに含めることに本質的な競合はありません。列挙型。ただし、これにより列挙型に変換する際に曖昧さが生じる可能性があります。例:
Color color1 = (Color)1; // Returns Red Color color2 = (Color)Enum.Parse(typeof(Color), "1"); // Also returns Red
color1 と color2 の両方に割り当てられた値は、技術的には Red ではなく 1 ですが、印刷されると Red として表示されます。
さらに、非一意の列挙型を比較すると、値は不可解な結果をもたらす可能性があります:
bool b = Color.Red == Color.Green; // True (Red is Green??)
この比較は論理的に間違っているように見えるかもしれませんが、それは基礎となる値が次のとおりであることの結果です。等しい。
最終的に、一意でない列挙値の使用は判断の問題です。このアプローチを利用する前に、リスクとメリットを慎重に比較検討することが重要です。
以上がC# では、複数の列挙値が同じ基になる値を共有できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。