8

ボクシングとアンボクシングはキャスト(実型からオブジェクトへ...オブジェクトから実型へ)に関するものであることを理解しています。しかし、私は、MSDNがNullableでそれについて何を言っているのか理解していません。これが私が理解していないテキストです:

null許容型がボックス化されると、共通言語ランタイムは、Nullableオブジェクト自体ではなく、Nullableオブジェクトの基になる値を自動的にボックス化します。つまり、HasValueプロパティがtrueの場合、Valueプロパティの内容はボックス化されます。null許容型の基になる値がボックス化されていない場合、共通言語ランタイムは、基になる値に初期化された新しいNullable構造を作成します。ソース

オブジェクトを実際の型に変更すると、null許容であった実際の型変数はオブジェクトの型になりますか?わからない?

4

3 に答える 3

14

それが言っていることは、あなたがそうするなら、それです:

int? x = 5;
object y = x; // Boxing

int箱入りではなく、箱入りになってしまいますNullable<int>。同様に、次の場合:

int? x = null; // Same as new Nullable<int>() - HasValue = false;
object y = x; // Boxing

次に、yはnull参照として終了します。

于 2008-12-17T14:59:14.020 に答える
8

つまり、次のことを行います。

int? i = 5;
object o = i;

ボックス化されているのは「int」(5)であり、「int?」ではありません。(5)。xがnull(!HasValue)の場合、oはnullになり、空の「int?」の周りのボックスではありません。

次に、開梱するとき:

i = (int?)o;

oがnullの場合、iは空の「int?」になります。それ以外の場合、5はボックス化されておらず、「新しいint?(5)」を作成するために使用されます。

基本的に、あなたは(浮気を除いて)nullable<T>直接箱を手に入れることができるべきではありません-箱だけを手に入れることができますT

于 2008-12-17T15:00:05.580 に答える
3

aNullable<T>がの場合null、null参照としてボックス化され、。を使用したボックス化された値型としては動作しませんHasValue = true

実際、この機能を実装するには、CLRが本質的にNullable<T>型をサポートし、それを異なる方法で処理する必要がありました。開発者は、のように機能する独自のタイプを作成することはできませんNullable<T>

これが後期の.NET2.0機能の1つであったことは注目に値します。初期のベータ版ではNullable<T>、通常の構造と同じように動作しました。最終リリースでは、ボックスからnull参照に変更されました。この変更は、SQL Server CLRチームにとって特に大きな問題であり、基本的な変更を行う必要がありました。

于 2008-12-17T15:08:15.080 に答える