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

C# 是否有类似于C的C4061的警告(错误)#,c#,enums,switch-statement,compile-time,C#,Enums,Switch Statement,Compile Time,通常,如果我在C#中使用switch作为枚举,我必须编写如下内容: switch (e) { case E.Value1: //... break; case E.Value2: //... break; //... default: throw new NotImplementedException("..."); } 在C++(for VS)中,我可以启用警告C406

通常,如果我在C#中使用switch作为枚举,我必须编写如下内容:

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

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

        //...
    default:
        throw new NotImplementedException("...");
}
<>在C++(for VS)中,我可以启用警告C4061和C4062来进行这个开关,使它们出错,并进行编译时检查。在C#中,我必须将此检查移动到运行时


有人知道在C#中如何在编译时检查这个吗?可能有一个默认禁用的警告,我错过了,或者其他方式?

不,没有编译时检查-有一个只处理一些命名值的开关/大小写是合法的。本来可以将其包括在内,但存在一些问题

首先,枚举值没有任何“命名”值是完全有效的(不幸的):

假设开关/案例中的任何值都是可行的,编译器无法知道您不是有意处理未命名的值

其次,它不能很好地处理
标志
枚举-编译器不知道哪些值是方便的组合。可以推断,但这有点令人讨厌

第三,这并不总是你想要的——有时你真的只想回应几个案例。我不想在合理的定期基础上压制警告

您可以使用预先检查,但这样做效率相对较低


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

我知道这是一个错误,但在编译器内部这一领域没有任何真正的改变。因此,我制作了Roslyn analyzer for switch语句。 你可以下载 这是Roslyn analyzer,它支持

  • 枚举操作|和&。因此,您也可以检查标志 (但与单个int值不同)

  • 当前数据上下文中的接口实现(模式匹配)

类的模式匹配还没有在版本0.4中实现(但我希望很快实现它)。
要使用它,只需将此软件包添加到项目中,如果您没有默认分支或它引发异常,您将收到所有未覆盖案例的警告。当然,您可以启用“将警告视为错误”对于所有的或特定的警告,请选择您的项目。如果您发现任何bug,请随时与我联系。请解释那些不熟悉C++ CXYZ警告的警告。它们在MSDN中解释得相当好。C++语言代码中的几个字,如果启用,请使用“开关”。对于某些枚举,如果忘记处理某些枚举值(在单独的“case”中),您将在编译过程中收到警告谢谢。但我不同意“不,不能进行编译时检查”在C++中,你也可以将任何值设置为枚举,但是有一个机会检查,你处理所有预期的值。也许你知道一些3rdPoad工具(比如StudioP)可以检查这个吗?@ Alk86:我不害怕。(这并不意味着它们不存在,只是我从来没有故意看到或使用过这样的特性。)有了Roslyn,您可能可以编写自己的,请注意:)这个答案的很大一部分倾向于“未显式声明的句柄枚举值”。然而,OP的问题更多的是关于“未能处理未显式声明的值”。(事实上,标志枚举是不同的,C#至少可以将它们分开一点,这很好。)Re:“只想响应少数情况”。。。当然可以,但是我们应该考虑一下未来的变化。添加一个新值时,默认处理可能不正确。这里有一个编译器警告/错误帮助,类似于成员的new/override关键字。
enum Foo
{
    Bar = 0,
    Baz = 1
}
...
Foo nastyValue = (Foo) 50;