null 許容型に基づくオブジェクトは、null 以外の場合にのみボックス化されます。HasValue が false の場合は、ボックス化ではなく、単にオブジェクト参照が null に代入されます。たとえば、次のように指定します。
bool? b = null;
object o = b;
// Now o is null.
オブジェクトが null 以外の場合 (HasValue が true の場合)、ボックス化が実行されますが、null 許容オブジェクトの基になる型のみがボックス化されます。null 以外の null 許容値型のボックス化では、その値型自体がボックス化され、その値型をラップする System.Nullable はボックス化されません。次に例を示します。
bool? b = false;
int? i = 44;
object bBoxed = b; // bBoxed contains a boxed bool.
object iBoxed = i; // iBoxed contains a boxed int.
上の例のボックス化された 2 つのオブジェクトは、null 非許容型のボックス化によって作成されたオブジェクトと同じです。また、ボックス化された null 非許容型と同様に、null 許容型にボックス化解除できます。この例を次に示します。
bool? b2 = (bool?)bBoxed;
int? i2 = (int?)iBoxed;

解説
ボックス化された場合の null 許容型の動作には、次の 2 つの利点があります。
-
null 許容オブジェクトとそのボックス化されたオブジェクトは、次のように null であるかどうかをテストできます。
bool? b = null;
object boxedB = b;
if (b == null)
{
// True.
}
if (boxedB == null)
{
// Also true.
} -
ボックス化された null 許容型は、次のように基になる型の機能を完全にサポートします。
double? d = 44.4;
object iBoxed = d;
// Access IConvertible interface implemented by double.
IConvertible ic = (IConvertible)iBoxed;
int i = ic.ToInt32(null);
string str = ic.ToString();
ボックス化の動作を含む、null 許容型のその他の例については、「null 許容のサンプル」を参照してください。

参照