範囲外の数値をC#の列挙型にキャストしても例外は生成されません
質問
次のコードは例外を生成せず、代わりに値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できる値を使用)を使用する場合に多くなる可能性があります。
所属していません StackOverflow