なぜunboxing enums利回り数が多かった。
質問
例えば:
Object box = 5;
int @int = (int)box; // int = 5
int? nullableInt = box as int?; // nullableInt = 5;
StringComparison @enum = (StringComparison)box; // enum = OrdinalIgnoreCase
StringComparison? nullableEnum = box as StringComparison?; // nullableEnum = null.
2物::
- できないのはなぜでしunboxる
StringComparison
?思この基底タイプInt32
だかおかしい。 - なぜ
nullableEnum
ての値がnull?
として理解している場合に有効でunboxingはboxed値型のこのタイプ、またはnull。の場合 int
でunboxる Enum
, そしてこないのはなぜ同じようにnullableます。同様に、場合の代わりに5boxed StringComparison.OrdinalIgnoreCase
, できること nullableInt
がnullの場合、 nullableEnum
いません。
解決
は厳密に、私はそれがののデル> の実装の詳細に<デル>バグランタイムだと思う話します
ソースオペランドヌル、またはそうでなければNULL可能型の基本型にオブジェクトインスタンスをボックス化解除の包まれた結果である。
ボックス化解除はnull許容型のヌル値を生成します
作品StringComparisonにアンボクシングは、その後のNullable
実行時に成功するために与えられた非null許容値型のボックス化解除の変換、元の値をオペランド、非null許容値型のボックス化値を参照しなければなりません。
あなたは箱入りintはStringComparisonの基になる型がintであるため、型StringComparisonの箱入り値であると考えられているかどうかを決定する必要があります。仕様では、ボックスは、「互換性のないオブジェクトを」含まれている場合、InvalidCastExceptionががスローされると言うことになります。あなたが安全にStringComparison変数にヒープから4つのバイトをコピーすることができますので、intは、StringComparisonと確かに「互換性」である。
他のヒント
は、それはまだ種類の情報を保持しています。だから、box is StringComparison
はfalse
を返します。しかし、任意の列挙型に任意の列挙型やint型にキャストするので、明示的なキャスト(StringComparison)box
の作品を許可されています。これは、列挙型のための特別なケースです。 Nullable<T>
は、他の一方で、あなたはキャストやチェック型のときTは、任意の特定の方法で処理されていない、いつものクラスです。このコードは例外をスローします理由はここにあります。
StringComparison? nullableEnum = (StringComparison?)nullableInt;
1)はい、列挙型のタイプの基礎となることはint型であり、それがこのように動作理由です。さらに。あなたは、次の操作を行うことができます:
enum MyEnum { One = 1, Two = 2, } int i = 3; MyEnum myEnum = (MyEnum)i; // This works without exceptions.
StringComparison?
は実際には異なるタイプであるNullable<StringComparison>
あるので 2)。そしてas
オペレータのみチェックオペレータように指定されたオブジェクトが同じタイプである場合。