ホームページ > バックエンド開発 > C++ > .NET で整数を列挙型にキャストしても例外がスローされないのはなぜですか?

.NET で整数を列挙型にキャストしても例外がスローされないのはなぜですか?

DDD
リリース: 2025-01-03 17:46:40
オリジナル
737 人が閲覧しました

Why Does Casting an Integer to an Enum in .NET Not Throw an Exception?

Int を無効な列挙値にキャストする: 予期しない動作を理解する

Java の列挙値の厳格な処理とは異なり、.NET 列挙型は次の場合に予期しない動作を示します。無効な整数値をその型にキャストします。これを説明するために、次のコードを考えてみましょう。

enum Beer
{
    Bud = 10,
    Stella = 20,
    Unknown
}

var i = 50;
var b = (Beer) i;

Console.WriteLine(b.ToString());
ログイン後にコピー

このコードは、例外をスローする代わりに、驚くべきことに i を Beer にキャストし、コンソールに「50」を出力します。なぜこのようなことが起こるのでしょうか?

舞台裏では、列挙型は int や short などの基礎となる値型によってサポートされています。これにより、これらの型に有効な任意の値を保存できるようになります。したがって、Beer 列挙型には定義された値が 3 つしかありませんが、それらの 1 つではない i にも対応できます。

この特定の動作は、.NET の作成者による決定に由来します。これには利点もありますが、実行時エラーを引き起こす可能性があるという批判も集めています。

懸念への対処

この問題に対処するために、一部の開発者はEnumUtil や EnumExtensions などのユーティリティ メソッドは、列挙型のフェイルファスト動作を提供します。これらのメソッドでは、予期しない例外を回避するために、キャスト前に enum 値が定義されていることを確認します。

EnumUtil の使用例を次に示します。

var definedValue = EnumUtil<Beer>.DefinedCast(i); // Throws exception if i is not defined in Beer
Console.WriteLine(definedValue.ToString());
ログイン後にコピー

説明を超えてください

.NET の列挙型の独特な動作により、「ビット フラグ」列挙型の使用も可能になります。これらの列挙型はバイナリ パターンを利用して、単一の列挙型値内の複数のアクティブなフラグを表します。これは、考えられるすべてのフラグの組み合わせを定義するのが面倒なシナリオで特に役立ちます。

結論

.NET の列挙型のキャスト動作を独特だと感じる人もいるかもしれませんが、無効な列挙値を処理する際のフェイルファスト動作を保証するための基礎となる理論的根拠と利用可能なオプションを理解することが重要です。ユーティリティ メソッドを利用したり、ビット フラグ列挙型の可能性を考慮したりすることで、開発者はこの独自の .NET 機能の潜在的な欠点を軽減できます。

以上が.NET で整数を列挙型にキャストしても例外がスローされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート