次のコードでは例外は発生せず、代わりに値4がtstに渡されます。誰もこれの背後にある理由を説明することはできますか?C#で列挙に範囲外の数値をキャストしても例外が発生しない
11
A
答えて
20
C#では、Javaと異なり、列挙型はチェックされません。基になる型の値を持つことができます。これがあなたの入力を確認することが非常に重要な理由です。
if(!Enum.IsDefined(typeof(MyEnum), value))
throw new ArgumentOutOfRangeException();
1
enumはintに基づいているため、intにできる値はすべて受け入れることができます。コンパイラに明示的に(キャスティングによって)4をエニュメントにキャストしても問題ないと伝えているので、それはそうです。
1
各列挙型には、表現に使用される基礎となる数値型(intなど)があります。値に名前がない場合でも、列挙型が持つ可能性のある値です。
1
他人が言っていないこと:キャスティングでは、自分が行っていることを知っていることをコンパイラに伝えます。だからあなたが言うなら、これをenum値として扱います。他のポスターは、たとえあなたが何をやっているのかを知っていても、C#コンパイラは多くの悪いことを許さないので、これがなぜ許されているのかを指摘しました。
フラグ値をintとして保存できないため、値が許可されていないと本当に悪いです。または、intが許容される組み合わせの1つであるかどうかをチェックする必要がありました。フラグの列挙型(値を一緒に使用できる)を使用すると、多くの場合があります。
関連する問題
- 1. なぜ「インデックスから範囲外の」例外が発生していますか?
- 2. SQLiteでインデックスの範囲外の例外が発生しています
- 3. formloadでdatagridviewエラーが発生しました:インデックスが範囲外の例外
- 4. 無効な列挙型の値にキャストすると、クライアント側で不特定の例外が発生します
- 5. C#のインデックス範囲外の例外
- 6. システム引数が範囲外例外
- 7. JS Uint16Arrayは範囲外例外を発生させません
- 8. C#Crystalレポートの引数が範囲外の例外
- 9. C++:例外処理で範囲外の配列から値を返す方法
- 10. 関数が範囲外の例外をスローし続ける
- 11. 範囲外の列挙型変換は、基になる型の外部に値を生成できますか?
- 12. 範囲外のインデックス例外
- 13. c#配列 - 範囲外の例外のインデックス
- 14. シグナルモジュールで例外が発生しない
- 15. Telerikのレポートで範囲外のエラーが発生しました
- 16. インデックス範囲外の例外:リストが追加範囲を使用して動作しない
- 17. ViewPagerで項目を削除してスクロールしようとすると、範囲外の例外が発生する
- 18. 例えば数値の範囲外と範囲内の範囲の
- 19. 例外(配列インデックスの範囲外例外)
- 20. EPPlus - 行範囲外例外
- 21. vb.netスクリプトでインデックスの範囲外エラーが発生しました
- 22. プログラムがクラッシュしてベクトル範囲外例外が発生したと言われました
- 23. 数値の範囲外
- 24. IOS/Objective-C:NSPredicateで範囲外エラーが発生しました。
- 25. C++の例外オブジェクトの範囲
- 26. 例外の引数が範囲外になるのはなぜですか?
- 27. IndexError:文字列インデックスが範囲外です(列挙型)
- 28. Objective-cサブストリング範囲の例外
- 29. 例外が発生しました:理由:許容範囲外の座標です。java.lang.IllegalStateException:許容範囲外の座標です。
- 30. PHP例外エラーが発生しない
私はJava開発者(LINQ!)として長く知っているC#のいくつかの機能がありますが、ここではJavaが本当に正しくなっています。 –
@saua:必ずしもそうではありません。これらは、このアプローチの利点と欠点です。 –
この点の主な利点は、[Flags]属性でマークする必要がある値を組み合わせることができることです。 –