Это синтаксический сахар; Nullable<T>
на самом деле struct
, поэтому на самом деле не может быть null
; компилятор превращает вызовы, которые сравниваются с null
(как ваш второй пример), в вызовы HasValue
.
Обратите внимание, однако, что вставка Nullable<T>
в object
приведет либо к значению T
(если оно имеет значение), либо к null
(если это не так).
И.Е.
int? foo = 10; // Nullable<int> with a value of 10 and HasValue = true
int? bar = null; // Nullable<int> with a value of 0 and HasValue = false
object fooObj = foo; // boxes the int 10
object barObj = bar; // boxes null
Console.WriteLine(fooObj.GetType()) // System.Int32
Console.WriteLine(barObj.GetType()) // NullReferenceException