【发布时间】:2021-07-02 15:24:32
【问题描述】:
我喜欢将枚举映射到值的 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),所以我认为这无关紧要。
【问题讨论】:
-
就我个人而言,我总是加一个"default" part,然后抛出异常。例如。
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Unexpected target value '{target}'."), -
除了要求不有一个“默认情况”在我看来可能是XY problem。
-
枚举可以是基本类型的任何值。它不需要是命名值。就像
(Target)5一样,即使枚举中没有 5 的等价物也可以工作。所以在一个 switch 中强制使用所有有效值似乎非常乏味。 -
您可以将 CS8524 和 CS8509 添加到项目的“将警告视为错误”部分
-
警告 CS8524 是专门为捕捉这种模式而引入的(CS8509 适用于不涉及枚举的情况)。让它成为一个错误,你就在那里。