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

标签 c# enums switch-statement compile-time

通常,如果我在 C# 中对枚举使用 switch,我必须这样写:

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

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

        //...
    default:
        throw new NotImplementedException("...");
}

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

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

最佳答案

不,没有编译时检查 - 有一个只处理一些命名值的开关/案例是合法的。包含它是可能的,但存在一些问题。

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

enum Foo
{
    Bar = 0,
    Baz = 1
}
...
Foo nastyValue = (Foo) 50;

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

其次,它不能很好地与 Flags 枚举一起使用 - 编译器并不真正知道哪些值是方便的组合。它可以推断出这一点,但这会有点恶心。

第三,这并不总是您想要的 - 有时您真的只想回应少数几个案例。我不想在合理的基础上抑制警告。

您可以使用 Enum.IsDefined预先检查这一点,但效率相对较低。

我同意所有这一切都有些痛苦 - 对于 .NET 而言,枚举有点令人讨厌 :(

关于c# - 是否有警告(错误),类似于 C# 的 C4061,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531132/

相关文章:

typescript - 如何在 Typescript 中获取枚举大小作为类型

c# - 如何将枚举转换为 C# 中的列表?

转到教程选择语句

ruby - 'case' 语句如何使用常量?

c# - 堆栈的替代方案

c# - 我可以对 RealProxy 实例使用反射吗?

c# - 使用 .net 从 Iothub 配置获取部署 list

c# - ASP.NET Identity 在管理 View 中检索和编辑用户数据?

angular - 从 6 到 7 的 Angular 迁移后无法比较 Jasmine 中的枚举

switch-statement - 发送电子邮件 - MFMailComposeResult