注:これは値ではなく引数を扱うため、提案された複製とは異なります。動作と適用可能なシナリオは本質的に異なります。
SomeEnum
次のように処理するswitchステートメントがあるとします。
enum SomeEnum
{
One,
Two,
}
void someFunc(SomeEnum value)
{
switch(value)
{
case SomeEnum.One:
...
break;
case SomeEnum.Two:
...
break;
default:
throw new ??????Exception("Unhandled value: " + value.ToString());
}
}
ご覧のとおり、可能なすべての列挙値を処理しますが、新しいメンバーが追加された場合に備えてデフォルトで例外をスローし続け、処理の欠落を認識していることを確認します。
私の質問は、指定されたコードパスが処理/実装されていない、またはアクセスされるべきではないことを通知したい場合の正しい例外は何ですか?以前は使用しNotImplementedException
ていましたが、適切ではないようです。次の候補はですInvalidOperationException
が、その用語は正しく聞こえません。正しいものとその理由は何ですか?
編集:C#8.0では、非記述的なswitchステートメントに対してコンパイラ警告を生成するswitch式が導入されました。これが、該当する場合は常にswitchステートメントではなくswitch式を使用する必要があるもう1つの理由です。同じ関数は、次のようなより安全な方法で記述できます。
void someFunc(SomeEnum value)
{
_ = value switch
{
SomeEnum.One => ....,
SomeEnum.Two => ....,
}
}
新しいメンバーがに追加されるSomeEnum
と、コンパイラは警告「CS8509:スイッチ式はその入力タイプのすべての可能な値を処理しません(網羅的ではありません)を表示します。たとえば、パターン'EnumHandling.SomeEnum.Three'は覆われていない。" 潜在的なバグを見つけやすくするスイッチ式の場合。