【发布时间】:2012-11-30 11:53:34
【问题描述】:
注意:这与建议的重复项不同,因为它处理的是参数而不是值。行为和适用场景有本质的不同。
假设我们有 SomeEnum 并有一个 switch 语句来处理它:
enum SomeEnum
{
One,
Two,
}
void someFunc(SomeEnum value)
{
switch(value)
{
case SomeEnum.One:
...
break;
case SomeEnum.Two:
...
break;
default:
throw new ??????Exception("Unhandled value: " + value.ToString());
}
}
如您所见,我们处理所有可能的枚举值,但仍保留默认值,以防添加新成员时抛出异常,并且我们希望确保我们知道缺少处理。
我的问题是:在您想要通知给定代码路径未处理/实现或不应该访问的情况下,正确的例外是什么?我们曾经使用NotImplementedException,但它似乎并不合适。我们的下一个候选人是InvalidOperationException,但这个词听起来不太对。什么是正确的,为什么?
编辑:C# 8.0 引入了switch expressions,它会为非详尽的 switch 语句生成编译器警告。这就是为什么您应该在适用的情况下使用 switch 表达式而不是 switch 语句的另一个原因。可以用更安全的方式编写相同的函数,例如:
void someFunc(SomeEnum value)
{
_ = value switch
{
SomeEnum.One => ....,
SomeEnum.Two => ....,
}
}
当一个新成员被添加到SomeEnum 时,编译器将显示警告 "CS8509: The switch expression does not handle all possible values of its input type (它不是穷举的)。例如,模式 'EnumHandling.SomeEnum.Three' 没有被覆盖。” 用于 switch 表达式,这样更容易捕捉潜在的错误。
【问题讨论】:
-
致那些将其作为重复项关闭的人:您指出的问题 1) 是不同的情况(未处理的返回值不是参数,我有一个单独的问题)2)关于返回值。通过谴责此处给出的答案并将他们引导到错误的上下文和答案,您实际上是在伤害来这里的人。
-
@Habib 和其他密切投票者:这是怎么重复的?此问题特定于作为参数传入的
enum值。另一个问题是关于不受支持的 switch case 的一般情况。这两个问题有不同的答案,有不同的推理。