7个回答

50

一个普遍的误解是,.Net枚举值仅限于在Enum中声明的值。但实际上,它们可以是枚举的基本类型(默认为int)范围内的任何值。例如,以下内容是完全合法的:

MyMethod((MyEnum)42);

这段代码将会编译通过,没有产生任何警告,并且不会触及你的case标签。

现在,你的代码是否选择处理这种情况是一个政策决策。这不是必须的,但我肯定会建议添加一个。我倾向于为我编写的每个枚举类型的switch都添加一个default,以处理这种情况,使用以下模式:

switch (value) { 
  ...
  default: 
    Debug.Fail(String.Format("Illegal enum value {0}", value));
    FailFast();  // Evil value, fail quickly 
}

7
我想补充一下Jared的答案,如果你有一个基于byte的枚举,并且在switch语句中包含了所有256种情况,即使如此编译器仍可能需要一个默认情况来进行确定性赋值检查。详见http://blogs.msdn.com/b/ericlippert/archive/2009/08/13/four-switch-oddities.aspx。 - Eric Lippert
2
另一个需要考虑的情况是,如果枚举在不同的程序集中定义。在这种情况下,有人可能会向枚举添加一个字段,然后运行您的代码以针对新版本进行测试而无需重新编译。编译器坚持生成能够应对这种情况的强健代码。 - ChaseMedallion

14

虽然枚举不会限制参数传递的范围,但某些人可能会传递不在您的枚举范围内的值,这并非必须要做的。

通常情况下我会添加一个默认值,并在指定的值不符合预期时抛出异常


8

从技术上讲,这并不是必要的,但因为您可以轻松地将MyEnum的基础类型(通常为int)的值转换为MyEnum的实例。因此,在其中添加一个带有Debug.Assert()的默认语句是一个好习惯。


5

虽然不是必须的,但这是一个好习惯,因为有人可能会在后面引入新的枚举类型。例如,抛出一个异常来表示未处理“未知”枚举类型。


3
不必要使用默认情况。

0

从纯粹的代码角度来看,没有必要有一个default情况。这完全取决于您的逻辑要求。


0

如果你将值转换为枚举未定义的值(不会抛出异常),或者如果你向枚举添加更多的值,那么这是必需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接