在没有“默认”成员的情况下,我认为拥有一个表示文字 int 0 的值是有价值的。
无论如何,将使用字面值 0 创建给定的枚举。这里最直接的情况是作为结构的成员。AC# struct 将始终有一个空的默认构造函数,它将所有字段初始化为其默认值。在枚举的情况下,这将是文字值 0。问题是如何处理它。
对我来说,这是一个风格问题:如果枚举没有显式初始化为一个值,应该给它一个任意的有效值还是一个表示缺乏显式初始化的特定值?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
在 v1 的情况下,如果检查了颜色字段,它将被明确标记为未初始化的字段。在 v2 中,该字段将简单地为“红色”。程序员无法检测到显式设置为“Red”或隐式默认值设置为“Red”。
导致问题的另一种情况是针对枚举值执行 switch 语句。让我们稍微改变 Color2 的定义。
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch ( p1.color ) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
开关处理枚举中的每个显式值。然而,对于 Example<Color2> 的默认构造函数,此代码将失败,并且无法抑制此构造函数。
这带来了一个稍微重要的规则:为字面值 0 有一个显式的枚举值。