Подтвердить что ты не робот

Почему некоторые методы работают, в то время как некоторые не имеют нулевых значений nullable structs?

Прямо до точки:

int? i = null;
i.ToString(); //happy
i.GetType(); //not happy

Я получаю очень близкий вопрос, который на самом деле говорит о том, почему i.ToString() работает нормально.

Изменить: Только что выяснилось, что этот угловой случай был самым проголосовавшим в этом потоке SO!

4b9b3361

Ответ 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() может работать, и она работает с значением внутри объекта.