9

次のコードを検討してください。

        private enum myEnum
        {
            A,
            B
        }
        private void myMethod(myEnum m)
        {
            switch (m)
            {
                case myEnum.A:
                    //do stuff
                break;
                case myEnum.B:
                   //do stuff
                break;
                default:
                   throw new NotImplementedException(m.ToString());
            }
        }

myEnumに3番目のメンバーCを追加した場合、実行時にNotImplementedExceptionによってのみ警告が表示されます。

私がやりたいのは、未処理のケースがあり、デフォルトがないスイッチがある場合にコンパイラーに警告してもらうことです:ケース。

それを行う方法、またはこの問題に対する他の解決策はありますか?最終的な目標は、コンパイル時に何かが欠落していることを警告することです。

4

5 に答える 5

6

残念ながら、これを行うコンパイラ機能はありません。

列挙型の代わりに、基本クラスまたはインターフェイスを使用します。MyMethod はインターフェイスで定義されています。

各 enum メンバーは、myMethod に対して異なる動作を持つクラスになります。クラスを追加して (オプションを拡張するために、現在は enum 項目を追加します)、myMethod を実装しないと、コンパイラ エラーが発生します。

selectステートメントで異なる動作を提供するコード内に多くの場所があることは、ポリモーフィズムを使用する必要があるかもしれない匂いです。

編集

私ができる最善のアドバイスは、switch ステートメントに依存する各関数の単体テストを作成し、列挙型の各値に対してそれを呼び出すことです (Enum クラスの GetValues メンバーを使用して、実行時に値を取得できます)。

于 2009-04-02T08:38:19.190 に答える
2

いいえ、言語にはこれをチェックするものは何もありません。

次のものを使用できます。

default:
    throw new ArgumentOutOfRangeException("Invalid value or bug");

ケースですが、明らかにそれはコンパイル時ではなく実行時です。

于 2009-04-02T08:53:50.260 に答える
1

使用したことはありませんが、FxCopが役立つ場合があります。カスタムルールの作成をサポートしています。もちろん、これはコンパイル時のチェックではなく、プロセスに統合できるものです。

于 2009-04-02T11:05:35.810 に答える
0

これはメンテナンスの悪夢になる可能性があり、switch ステートメントで欠落している列挙値をデバッグしようとして非常に長い時間を費やさなければなりませんでした。

switch ステートメントをメンテナンスしやすいように小さなクラスを作成しました。

ここに画像の説明を入力

このクラスは、すべての列挙値が処理されるか、明示的に無視されることを確認します。それ以外の場合は、NotImplementedExpcetion をスローします。

ソースコードと詳細はこちら

于 2013-04-30T22:49:30.140 に答える
0

C# で判別共用体を実行するためのライブラリを作成しました。これは、コンパイル時に徹底的なマッチングを提供するためのソリューションです。https://github.com/mcintyre321/OneOfを参照

Install-Package OneOf

OneOf から OneOf までの DU を実行するためのジェネリック型が含まれています。それぞれに .Match と .Switch ステートメントがあり、コンパイラの安全な型付き動作に使用できます。たとえば、次のようになります。

OneOf<A, B> aOrB = GetValue(); 
aOrB .Switch(
    a=> DoSomething(a),
    b=> DoSomethingElse(b)
)
于 2018-11-09T11:05:14.127 に答える