如果switch(enum_val)缺少case语句,有没有办法让C#编译器发出错误?

mos*_*ald 22 c#

我刚刚意识到我在枚举中的"必须处理"值列表中添加了一个值,但直到运行时我才抓到它.我知道C#编译器在涉及类型的反射和内省时非常强大,所以我想知道是否有办法强制switch/ case语句覆盖所有可能的enum值?

例:

enum Colors
{
   Red,
   Blue,
   Green,
   Yellow
};

Colors c = ...;

switch (c)
{
   case Colors.Red:  // No error, Red is a Color
      break;
   case Colors.Blue:
   case Colors.Green:  // No error, Blue and Green handled as well
      break;
}  // whoops! "error: 'Colors.Yellow' unhandled"
   // or even, "error: no 'default' and 'Colors.Yellow' unhandled"
Run Code Online (Sandbox Code Playgroud)

我想要一个编译时的解决方案.

Chr*_*rle 13

没有没有编译时间的方法来实现这一点.然而,非常简单的答案是有一个default处理程序,它只是抛出一个异常,"这个选项没有处理,boo".

switch (c)
{
    case Colors.Red:  // no error, Red is a Color
        break;
    case Colors.Blue:
    case Colors.Green:  // no error, Blue and Green handled as well
        break;
    default:
        throw new Exception("Unhandled option: " + c.ToString());
}
Run Code Online (Sandbox Code Playgroud)

  • 但这会将静态验证变为运行时故障. (20认同)

Luk*_*ský 9

您可以使用SwitchEnumAnalyzer获取此类编译器时间警告.我只是在我的项目中使用它,它工作得很好.与任何Roslyn分析器一样,您可以选择通知级别 - 如果它应该只是警告或适当的错误.