我可以强制非详尽的 c# switch 表达式导致编译错误吗?

问题描述

我喜欢用于将枚举映射到值的 switch 表达式 - 虽然不是最具扩展性的解决方案,但如果枚举代表某种模式(并且不是很大),它会快速且相当干净。

错误一个常见来源是向枚举添加成员 - 这通常会导致未处理的新案例。

但我认为,如果我们可以为非穷举开关编译错误,那么这些错误几乎可以消除,从而使遗漏很容易可见和修复。 (认情况必须被省略,否则一切都没有实际意义)

这可能吗?我在想这样的事情:

public string GetTargetValue()
{
    return target switch
   {
       Target.A => "foo",Target.B => "bar",// Compile error if someone added Target.C,otherwise works fine
       // no default case - it would defeat the point
   };
}

P.S:我主要在 Unity 中工作,但据我所知,较新版本的 Unity 使用 Roslyn 编译器(我不使用 Burst),所以我认为这无关紧要。

解决方法

是的,你可以。

这种情况会引发警告 CS8509,因为您可以see here。要将其转化为错误,请将以下内容添加到您的 .editorconfig 中:

dotnet_diagnostic.CS8509.severity = error

您可能还想忽略 CS8524,如果您没有默认情况就会发生这种情况,并且没有引发 CS8509(因此即使您涵盖了所有可能的值),see here。在这种情况下,编译器将插入带有 throw new SwitchExpressionException(target):

的默认情况
dotnet_diagnostic.CS8524.severity = none

我怀疑您可能需要使用 .NET 5 SDK 进行构建才能生成此警告。