问题描述
我喜欢用于将枚举映射到值的 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 进行构建才能生成此警告。