枚舉聲明中的多個值:深入了解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 值,因為第一個賦值是任意的。從技術上講,顏色 1 和顏色 2 都沒有指定為紅色;相反,它們的值為 1。但是當顯示時,您將看到紅色。
此外,非唯一枚舉值之間的比較操作可能會產生令人驚訝的結果:
// true (Red is Green??) bool b = Color.Red == Color.Green;
這個等式成立,因為紅色和綠色的基礎數值都是1。
雖然這種行為本質上沒有問題,但在使用時值得考慮具有非唯一值的枚舉。確定這種非唯一性是否符合枚舉設計的預期目的和語義至關重要。
以上是C# 中的枚舉可以保存具有相同基礎常數的多個值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!