我可以强制非详尽的 c# switch 表达式导致编译错误吗?
Can I force a non-exhaustive c# switch expression to cause a compile error?
我喜欢将枚举映射到值的 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 或更高版本进行构建才能生成此警告。
我喜欢将枚举映射到值的 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 或更高版本进行构建才能生成此警告。