Почему некоторые методы работают, в то время как некоторые не имеют нулевых значений nullable structs?
Прямо до точки:
int? i = null;
i.ToString(); //happy
i.GetType(); //not happy
Я получаю очень близкий вопрос, который на самом деле говорит о том, почему i.ToString()
работает нормально.
Изменить: Только что выяснилось, что этот угловой случай был самым проголосовавшим в этом потоке SO!
Ответы
Ответ 1
Это потому, что ToString
является виртуальным, а GetType
- нет. У Nullables есть специальное поведение бокса в CLR. Когда вы вызываете GetType
по nullable, он помещается в коробку (см. MSDN, на самом деле это происходит для любого struct
). Однако с нулевым значением базовое значение помещается в бокс, а не фактическое значение NULL. ToString
, с другой стороны, вызывает переопределение метода ToString на Nullable<T>
. Кроме того, я хотел бы отметить, что int? i = null
является синтаксическим сахаром для Nullable<int> i = new Nullable<int>()
. Итак, действительно существует объект в вашей переменной i
.
Ответ 2
Почему i.ToString()
не работает?
Используйте любой декомпилятор .NET и посмотрите класс Nullable<T>
. Вы увидите, что ToString()
переопределяется следующим образом:
public override string ToString()
{
if (!this.HasValue)
return "";
else
return this.value.ToString();
}
Почему сбой i.GetType()
?
См. mike z answer.
Ответ 3
Тип int?
не является обычным типом.
Когда вы пишете int? i = null
, только значение объекта, но не самого объекта.
Объект int?
наследования от object
, поэтому функция i.ToString()
может работать, и она работает с значением внутри объекта.