7

通常、C# で列挙型に switch を使用する場合、次のように記述する必要があります。

switch (e)
{
    case E.Value1:
        //...
        break;

    case E.Value2:
        //...
        break;

        //...
    default:
        throw new NotImplementedException("...");
}

C++ (VS 用) では、このスイッチの警告 C4061 と C4062 を有効にし、それらをエラーにして、コンパイル時のチェックを行うことができます。C# では、このチェックをランタイムに移動する必要があります...

C#でこれをコンパイル時にチェックする方法を知っている人はいますか? たぶん、私が見逃した、または他の方法で、デフォルトで無効になっている警告がありますか?

4

2 に答える 2

6

いいえ、コンパイル時のチェックはありません。名前付きの値の一部のみを処理するスイッチ/ケースを使用することは正当です。それを含めることは可能でしたが、いくつかの問題があります。

まず、enum 値が「名前付き」値を持たないことは (残念ながら) 完全に有効です。

enum Foo
{
    Bar = 0,
    Baz = 1
}
...
Foo nastyValue = (Foo) 50;

スイッチ/ケース内で任意の値が実行可能であることを考えると、名前のない値を処理しようとする意図がなかったことをコンパイラは認識できません。

第 2 に、Flags列挙型ではうまく機能しません。コンパイラは、どの値が便利な組み合わせになるかを実際には認識していません。それ推測できますが、少し厄介です。

第三に、それは常にあなたが望むものではありません - いくつかのケースにのみ対応したい場合があります。合理的に定期的に警告を抑制する必要はありません。

これを前もって確認するために使用できますEnum.IsDefinedが、それは比較的非効率的です。

これはすべて少し面倒だということに同意します.NETに関しては、列挙型は少し厄介な領域です:(

于 2012-09-21T13:04:09.527 に答える