int
をNULL可能として宣言するとき
int? i=null;
ここでi
は参照型になりますか?
いいえ、nullableは構造体です。何が起きているかというと、null許容構造体には2つの値があります。
int
for int?
、DateTime
for DateTime?
など)。HasValue
はプロパティです。)データ型の値を設定すると、構造体はHasValue
をtrueに変更します。
From Nullable Types(C#Programming Guide) :
Nullable型は、System.Nullable構造体のインスタンスです。
そして
ヌル可能型は、ヌルの値を割り当てることができる値型変数を表します。参照型に基づいてnull許容型を作成することはできません。 (参照型はすでにnull値をサポートしています。)
したがって、参照型ではありません。
Nullable型は、値型でも参照型でもありません。これらは値型に似ていますが、参照型のプロパティがいくつかあります。
当然、null許容型はnull
に設定されます。さらに、null許容型は一般的なstruct
制約を満たすことができません。また、HasValue
がfalse
に等しいNULL可能型をボックス化すると、ボックス化されたNULL可能型の代わりにnull
ポインターが得られます(ボックス化解除でも同様の状況が存在します)。
これらのプロパティは、null許容型を非値型にしますが、参照型でもありません。これらは、独自の特別なnull値の型です。
いいえ、Nullable型は実際には構造体です。ランタイムは、null値の設定をインテリジェントに処理し、そうでない場合に参照型の外観を提供します。
Nullable型を参照型にすることはできません。
代わりにnullを渡すことができるため、参照型をnull許容型にする必要はありません。