枚举声明中的多个值:深入了解 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中文网其他相关文章!