Немного поздно, но помимо ответа Марка на ваш вопрос, я хочу дать дополнительную информацию о типах значений Nullable в CLR.
CLR имеет встроенную поддержку типов значений, допускающих значение NULL. Эта специальная поддержка предоставляется для бокса, распаковки, вызова GetType
, вызова методов интерфейса .
Например, давайте проверим GetType()
:
Int32? x = 5;
Console.WriteLine(x.GetType());
Как вы думаете, это будет печатать на консоли?
System.Nullable<Int32
? Нет, результат System.Int32
.
Или давайте проверим бокс, который вы отметили в своем вопросе:
Int32? n =5;
Object o = n;
Console.WriteLine("o's type={0}", o.GetType()); // "System.Int32"
Правило таково:
Когда CLR упаковывает экземпляр Nullable, он проверяет,
имеет значение null, и если да, то CLR на самом деле ничего не упаковывает, а null
вернулся. Если экземпляр Nullable не является нулевым, CLR принимает
значение из обнуляемого экземпляра и коробки его. Другими словами,
Nullable со значением 5 помещается в штучной упаковке Int32 с
значение 5
И, наконец, я хочу объяснить, как CLR добавляет специальную поддержку для вызова методов интерфейса из Nullable Types.
Давайте посмотрим на это:
Int32? n = 5;
Int32 result = ((IComparable) n).CompareTo(5); // Compiles & runs OK
Console.WriteLine(result); // 0
В предыдущем коде я приведу Nullable<Int32>
к IComparable<Int32>
интерфейсу
тип. Однако тип Nullable<T>
не реализует интерфейс IComparable<Int32>
как
Int32
делает. Компилятор C # позволяет этот код компилировать в любом случае.