是否有警告(错误),类似于C#C4061 for C#

Ale*_*k86 7 c# enums switch-statement compile-time

通常,如果我在C#中使用switch for enums,我必须编写类似的东西:

switch (e)
{
    case E.Value1:
        //...
        break;

    case E.Value2:
        //...
        break;

        //...
    default:
        throw new NotImplementedException("...");
}
Run Code Online (Sandbox Code Playgroud)

在C++(对于VS)中,我可以为此开关启用警告C4061和C4062,使它们出错并进行编译时检查.在C#中,我必须将此检查移至运行时...

有谁知道在C#中如何在编译时检查这个?也许有一个警告,默认情况下禁用,我错过了,或者其他方式?

Jon*_*eet 5

不,没有编译时检查 - 有一个只处理一些命名值的开关/案例是合法的.它本来可以包括它,但有一些问题.

首先,对于枚举值不具有任何"命名"值完全有效(不幸的是):

enum Foo
{
    Bar = 0,
    Baz = 1
}
...
Foo nastyValue = (Foo) 50;
Run Code Online (Sandbox Code Playgroud)

鉴于在switch/case 中任何值都是可行的,编译器无法知道你并不想要尝试处理未命名的值.

其次,它不适用于Flags枚举 - 编译器并不真正知道哪些值是方便的组合.它可以推断,但它会有点icky.

第三,它并不总是你想要的 - 有时你真的只想回应一些案例.我不想在合理的定期基础上压制警告.

你可以Enum.IsDefined用来预先检查这个,但效率相对较低.

我同意所有这一切都有点痛苦 - 当谈到.NET时,枚举是一个令人讨厌的领域:(

  • 谢谢.但我不同意"不,不能进行编译时检查".在C++中,您可以将任何值设置为枚举,但有机会检查您是否处理了所有预期值. (2认同)