我见过帖子relating to C++,但是我特意要求C#.NET(4.0 +)。
以下示例是否需要默认情况?
public enum MyEnum : int
{
First,
Second
}
public class MyClass
{
public void MyMethod(MyEnum myEnum)
{
switch (myEnum)
{
case MyEnum.First: /* ... */ break;
case MyEnum.Second: /* ... */ break;
default: /* IS THIS NECESSARY??? */ break;
}
}
}
答案 0 :(得分:31)
一个常见的误解是.Net枚举值仅限于枚举中声明的值。实际上,虽然它们可以是枚举的基本类型范围内的任何值(默认为int
)。例如,以下是完全合法的
MyMethod((MyEnum)42);
此代码将在没有警告的情况下进行编译,并且不会点击任何case
标签。
现在,您的代码是否选择处理此类方案是一项政策决定。这不是必要但我肯定会推荐拥有一个。我更喜欢在枚举上为每个default
添加一个switch
,我专门针对此方案编写了以下模式
switch (value) {
...
default:
Debug.Fail(String.Format("Illegal enum value {0}", value));
FailFast(); // Evil value, fail quickly
}
答案 1 :(得分:13)
这不是绝对必要的,但有人可能会传入您的枚举未涵盖的值(因为枚举实际上并不限制允许的参数值范围)。
如果指定的值是意外的,我通常会添加默认值throw
。
答案 2 :(得分:6)
这在技术上是不必要的,但是因为您可以轻松地将MyEnum
的基础类型(通常为int)的值转换为MyEnum
的实例。因此,最好添加一个带有Debug.Assert()
的默认语句。
答案 3 :(得分:5)
这不是必需的,但是很好的做法,因为有人可能会在以后引入新的枚举。例如,抛出一个异常,指示未处理“未知”枚举。
答案 4 :(得分:3)
不,不需要默认情况。
答案 5 :(得分:0)
从纯粹的代码角度来看,不需要default
个案例。这完全取决于您的逻辑要求。
答案 6 :(得分:0)
如果你输入enum undefined值(不会引发异常),也需要它,如果你向枚举添加更多值。