Как я могу выполнить метод на int? установить значение null без исключения NullReferenceException?

Я прочитал в MSDN, что:

Ключевое слово null - это литерал, представляющий нулевую ссылку, один который не относится к какому-либо объекту.

Но я видел, что следующий код работает без каких-либо исключений:

int? i = null;
var s = i.ToString();

Итак, если переменная i равна нулю, почему я могу ее выполнить?

Ответ 1

Поскольку int? на самом деле является Nullable<Int32> и Nullable<T> является struct, а структура не может быть нулевым.

Это как Неверные типы работают. Они не являются ссылочными значениями, поэтому они не могут быть нулевыми, но они могут иметь если они считаются эквивалентными нулю.

Вы можете получить более подробную информацию о реализации Nullable<T> в как типы с нулевым значением, реализованные под капотом в .net? и Nullable < Т > реализация


Хотя, как указано @JeppeStigNielsen, есть один случай, когда вы можете получить NRE:

Однако: при вставке в ссылочный тип особое внимание уделяется Nullable < > гарантирует, что мы получим истинную нулевую ссылку. Так, например, i.GetType() с i, поскольку в вопросе взорвется NullReferenceException. Это связано с тем, что этот метод объект и не переопределяемый

Ответ 2

Код, который вы вставили

int? i = null;

на самом деле является просто сокращением для

int? i = new int?();

Это сокращение для

Nullable<int> i = new Nullable<int>();

Назначение нулевого значения - использование неявного оператора, о котором вы можете прочитать здесь MSDN.