ホームページ >バックエンド開発 >C++ >C# で Int を無効な列挙値にキャストすると例外がスローされないのはなぜですか?

C# で Int を無効な列挙値にキャストすると例外がスローされないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-03 04:55:45192ブラウズ

Why Doesn't Casting an Int to an Invalid Enum Value in C# Throw an Exception?

無効な列挙値に Int をキャストしても例外はスローされません

次の C# コードを考えてみましょう:

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

通常、次のような列挙型の範囲外の整数は、例外:

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

ただし、上記のコードは例外をスローせず、代わりに「50」をコンソールに出力します。

NET Framework の動作

これは、 .NET Framework での設計上の決定に影響します。 enum は別の値の型 (int、short、byte など) によってサポートされるため、それらの値の型に有効な任意の値を持つことができます。

影響と解決策

一方、この動作は混乱を招く可能性がありますが、バイナリ パターンを使用して列挙値内のさまざまなフラグの組み合わせを表す「ビット フラグ」列挙型の作成も可能になります。考えられるすべてのフラグの組み合わせを明示的に定義するのは面倒です。

未定義の列挙値の問題に対処するには、次のような高速に失敗するユーティリティ メソッドを使用することをお勧めします。

public static class EnumUtil<T>
{
    public static T DefinedCast(object enumValue)
    {
        if (!System.Enum.IsDefined(typeof(T), enumValue))
            throw new InvalidCastException(enumValue + " is not a defined value for enum type " +
                                           typeof(T).FullName);
        return (T)enumValue;
    }
}

このメソッドはスローします。キャスト値が列挙型に定義されていない場合は例外です。

以上がC# で Int を無効な列挙値にキャストすると例外がスローされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。