在C#中是否需要枚举开关上的默认情况?

时间:2010-12-17 16:45:14

标签: c# .net enums switch-statement

我见过帖子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;
        }
    }
}

7 个答案:

答案 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值(不会引发异常),也需要它,如果你向枚举添加更多值。