値型 T に対して型 T? は値だけでなく null も取ることができる。
T? は Nullable<T> の Alias である。
null 許容型の使用例を以下に示す。
// Nullable
// println() 関数
Action<Object> println = o => Console.WriteLine(o.ToString());
Console.WriteLine("<< Nullable >>");
// int? と Nullble<int> は同じ。
int? a0 = 1;
Nullable<int> a1 = a0;
// 次のような代入はコンパイルエラーになる。
// int b = a0;
// Nullable.HasValue : その値が null かどうか判別
println(a1.HasValue); // true
a1 = null;
println(a1.HasValue); // false
// int? から int への変換: int をキャストする。
if (a0.HasValue)
{
println((int)a0);
}
// Nullable<T> も演算可能だが、 値が null だった場合の結果は演算により異なる。
a1 = 2;
println(a0 + a1);
// null 合体演算子 (??) : 値が null かどうかを判別し、null の場合には別の値を割り当てる演算子
int? a2 = 4;
a2 = a2 ?? 5; // a2 は null でないので何もしない。
if (a2.HasValue == false)
println("null");
else
println(a2);
a2 = null;
a2 = a2 ?? 7; // a2 は null なので代わりに 7 になる。
// ??= を使うと 前のような if 文が簡単になる。 下の例では null だったときは 0 が表示される。
println(a2 ??= 0);