質問

例えば:

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物::

  1. できないのはなぜでしunboxる StringComparison?思この基底タイプ Int32 だかおかしい。
  2. なぜ nullableEnum ての値がnull?

として理解している場合に有効でunboxingはboxed値型のこのタイプ、またはnull。の場合 int でunboxる Enum, そしてこないのはなぜ同じようにnullableます。同様に、場合の代わりに5boxed StringComparison.OrdinalIgnoreCase, できること nullableInt がnullの場合、 nullableEnum いません。

役に立ちましたか?

解決

C#の仕様は、

と言うので、

は厳密に、私はそれがのの の実装の詳細に<デル>バグランタイムだと思う話します

  ソースオペランドヌル、またはそうでなければNULL可能型の基本型にオブジェクトインスタンスをボックス化解除の包まれた結果である。

場合null許容型に

ボックス化解除はnull許容型のヌル値を生成します

作品StringComparisonにアンボクシングは、その後のNullable にアンボクシングはあまりにも動作する必要がある場合、です。これは、両方が動作するはずまたは両方が故障したかどうかちょっと不明です。スペックは、

と言います
  

実行時に成功するために与えられた非null許容値型のボックス化解除の変換、元の値をオペランド、非null許容値型のボックス化値を参照しなければなりません。

あなたは箱入りintはStringComparisonの基になる型がintであるため、型StringComparisonの箱入り値であると考えられているかどうかを決定する必要があります。仕様では、ボックスは、「互換性のないオブジェクトを」含まれている場合、InvalidCastExceptionががスローされると言うことになります。あなたが安全にStringComparison変数にヒープから4つのバイトをコピーすることができますので、intは、StringComparisonと確かに「互換性」である。

他のヒント

あなたがオブジェクトに列挙型や整数を唱えたとき、

は、それはまだ種類の情報を保持しています。だから、box is StringComparisonfalseを返します。しかし、任意の列挙型に任意の列挙型や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オペレータのみチェックオペレータように指定されたオブジェクトが同じタイプである場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top