Не могли бы вы объяснить, почему Console.WriteLine записывает пустую строку ( Console.WriteLine(null)
выдает ошибку компиляции) и почему нет NullReferenceException (даже a+=1
не должно вызывать его)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
++
,+=
и+
подняли варианты. Следовательно, все утвержденияa++;
,a += 1;
иa = a + 1;
разрешены. Каждый производитnull
(без исключения) еслиa
изначальноnull
.NullReferenceException
? ноint?
это не аReference
, это просто то,int
что может иметьnull
значениеОтветы:
Вы наблюдаете за действием поднятого оператора .
Из раздела 7.3.7 спецификации C # 5:
По сути,
a++
в этом случае это выражение с результатомnull
(какint?
), а переменная остается нетронутой.Когда ты звонишь
который помещается в рамку
object
, что преобразует его в пустую ссылку, которая печатается как пустая строка.источник
Console.WriteLine(a == null ? "null" : a)
?a
имеет типint?
, я бы сказал,a ?? "null"
что не находит общего типа для двух операндов. Вам нужнаobject
обычная подсказка . Так что приведите к этому любой операнд.a
Будет в штучной упаковке. Например((object)a) ?? "null"
илиa ?? (object)"null"
.Ответ Джона правильный, но я бы добавил несколько дополнительных примечаний.
Имеется 19 перегрузок,
Console.WriteLine
и три из них применимы к anull
: одна принимает astring
, другая принимает achar[]
и третья принимаетobject
. C # не может определить, какой из этих трех вы имеете в виду, поэтому выдает ошибку.Console.WriteLine((object)null)
будет законным, потому что теперь это ясно.a
является нулемint?
. При разрешении перегрузки выбираетсяobject
версия метода, поэтомуint?
для ссылки используется пустая. Таким образом, это в основном то же самоеConsole.WriteLine((object)null)
, что записывает пустую строку.Где пустая ссылка, которая вас беспокоит?
a
- это нуль,int?
который изначально не является ссылочным типом! Помните, что типы значений, допускающие значение NULL, являются типами значений , а не ссылочными типами , поэтому не ожидайте, что они будут иметь ссылочную семантику, если они не упакованы в ссылочный тип. В дополнении бокса нет.источник
Этот оператор просто означает,
null++
например, null + 1.Согласно этому документу тип, допускающий значение NULL, может представлять правильный диапазон значений для своего базового типа значения плюс дополнительное значение NULL. Nullable, произносится как «Nullable of Int32», может быть присвоено любое значение от -2147483648 до 2147483647, или оно может быть присвоено нулевое значение
Здесь вы увеличиваете значение null, тогда оно также станет нулевым значением, а не 0 или любым другим целым числом.
когда вы печатаете тип, допускающий значение NULL, с нулевым значением, он печатает пустой вместо ошибки, потому что вы печатаете переменную, то есть значение ячейки памяти. который может быть нулевым или любым целым числом.
Но когда вы пытаетесь напечатать null с помощью
Console.WriteLine(null)
, поскольку null не является переменной, поэтому он не ссылается ни на одну ячейку памяти. Следовательно, это дает ошибку"NullReferenceException"
.В этом случае 2 попадет в память во временном месте, а указатель указывает на эту ячейку памяти для печати.
источник