範囲外の数値をC#の列挙型にキャストしても例外は生成されません

StackOverflow https://stackoverflow.com/questions/618305

  •  03-07-2019
  •  | 
  •  

質問

次のコードは例外を生成せず、代わりに値4をtstに渡します。誰もがこの背後にある理由を説明できますか?

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
役に立ちましたか?

解決

C#では、Javaとは異なり、列挙型はチェックされません。基本型の任意の値を使用できます。このため、入力を確認することが非常に重要です。

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

他のヒント

enumはintに基づいているため、intで可能な任意の値を受け入れることができます。そして、コンパイラーに(キャストによって)明示的に4を列挙型にキャストしてもよいことを伝えているので、そうします。

各列挙型には、表現に使用される基礎となる数値型(intなど)があります。値に名前がなくても、enumが取りうる値です。

他の人が言わなかったこと:キャストすることで、コンパイラに自分が何をしているか知っていることを伝えます。したがって、これを列挙する場合、列挙値として扱います。他のポスターは、あなたが何をしているのか知っていると言っても、C#コンパイラは多くの悪いことを許可しないので、なぜこれがまだ許可されるのかを指摘しました。

値が許可されていないと、フラグ値をintとして保存できなかったため、本当に悪いでしょう。または、intが許可された組み合わせの1つであるかどうかを確認する必要がありました。これは、フラグ列挙(一緒にorできる値を使用)を使用する場合に多くなる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top