Jons Antwort ist richtig, aber ich würde einige zusätzliche Notizen hinzufügen.
Warum gibt Console.WriteLine(null)
es einen Kompilierungsfehler?
Es gibt 19 Überladungen von Console.WriteLine
und drei davon sind auf a anwendbar null
: die, die a nimmt string
, die, die a nimmt char[]
und die, die a nimmt object
. C # kann nicht bestimmen, welche dieser drei Sie meinen, daher gibt es einen Fehler. Console.WriteLine((object)null)
wäre legal, denn jetzt ist es klar.
Warum schreibt Console.WriteLine(a)
man eine leere Zeile?
a
ist eine Null int?
. Die Überlastungsauflösung wählt die object
Version der Methode aus, sodass die int?
Box auf eine Nullreferenz gesetzt wird. Das ist also im Grunde dasselbe wie das Console.WriteLine((object)null)
, was eine leere Zeile schreibt.
Warum gibt es nicht NullReferenceException
auf dem Inkrement?
Wo ist die Null - Referenz , dass Sie besorgt sind? a
ist eine Null, int?
die zunächst kein Referenztyp ist! Denken Sie daran, Nullable - Wertetypen sind Werttypen , nicht Referenztypen , also nicht erwarten , dass sie Referenzsemantik haben , wenn sie auf einen Referenztyp sind eingerahmt. Es gibt kein Boxen im Zusatz.
++
,+=
und+
haben Varianten angehoben. Daher sind die Aussagena++;
,a += 1;
unda = a + 1;
sind alle erlaubt. Jedes Produktnull
(keine Ausnahme ausgelöst)a
ist anfangsnull
.