支援實值型別,可以類似參考型別指派 null給它。 ---------- class NullableExample { static void Main() { int? num = null; if (num.HasValue == true) { System.Console.WriteLine("num = " + num.Value); } else { System.Console.WriteLine("num = Null"); } // y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (System.InvalidOperationException e) { System.Console.WriteLine(e.Message); } } } output: num = Null Nullable object must have a value. ---------- 可為 Null 的型別有下列特性: 可為 Null 的型別代表能夠指派 null 值的實值型別變數。 您無法根據參考型別建立可為 Null 的型別 (參考型別已支援 null 值) 語法 T? 是 Nullable的簡略表示法,其中 T 是實值型別。 兩種格式可以互相變更 就像針對一般實值型別一樣,將值指派至可為 Null 的型別,例如 int?x = 10 或 double? d = 4.108.不過,對於可為 Null 的型別也可以指派 null 值: int? x = null. 使用 Nullable.GetValueOrDefault 方法傳回指派的值;若值為 null,則傳回基礎型別的預設值,例如 int j = x.GetValueOrDefault(); 使用 HasValue 和 Value 唯讀屬性測試 null 並擷取值,例如 if(x.HasValue) j = x.Value; 如果變數包含值 HasValue 屬性會傳回 true,而如果變數是 null 則傳回 false 如果有指派值, Value 屬性便會傳回值。 否則,會擲回 System.InvalidOperationException 。 HasValue 的預設值為 false。 Value 屬性沒有預設值。 您可以在可為 Null 的型別上使用 == 與 != 這兩個運算元,例如 if (x != null) y = x;。 當目前值為 null 的可為 Null 型別指派至不可為 Null 的型別時,請使用 ?? 運算子指派將套用的預設值,例如 int?x = null; int y = x ??-1; 不允許巢狀式可為 Null 的型別。不會編譯下列程式碼行: Nullable> n; ---------- 如果型別可以指派值或 null(表示型別沒有任何值),則這個型別稱為可為 null。 因此,可為 null 的型別 (Nullable Type) 可以表示值,或表示值不存在。例如,參考型別 (如 String) 可為 null,而實值型別 (如 Int32) 則否。 因為實值型別只有表示該型別適當值的足夠容量,並沒有表示 null 值所需的額外容量,所以不可為 null。 Nullable 類別為 Nullable結構提供了互補支援。 Nullable 類別支援取得可為 null 的型別之基礎型別,以及在可為 null 的型別 (其基礎實值型別並不支援泛型比較和相等作業) 之配對上的比較和相等作業。 案例 視情況而定,您可以使用可為 null 的型別表示存在或不存在的內容。例如,HTML 標記的選擇性屬性可能存在於某個標記,但不存在於其他標記;資料庫資料表的可為 null 資料行可能存在於資料表的某個資料列,但不存在於其他資料列。 您可以將屬性或資料行表示為類別中的欄位,然後將欄位定義為實值型別。此欄位可以包含屬性或資料行的所有有效值,但不可含有其他值 (表示屬性或資料行不存在)。在這個狀況下,您可以將欄位定義為可為 null 的型別,取代實值型別。 Boxing 和 Unboxing 當可為 null 的型別為 boxed,Common Language Runtime 就會自動 Box Nullable物件的基礎值,而非 Nullable物件本身。 也就是說,如果 HasValue 屬性為 true, Value 屬性的內容即為 boxed。 如果 HasValue 屬性為 false,則會 Box null。 當可為 null 的型別之基礎值為 unboxed,Common Language Runtime 就會建立初始化為基礎值的新 Nullable結構。