Könnten Sie bitte erklären, warum Console.WriteLine eine leere Zeile schreibt ( Console.WriteLine(null)
geben Sie mir einen Kompilierungsfehler) und warum es keine NullReferenceException gibt (auch a+=1
wenn sie nicht ausgelöst werden sollte)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
++
,+=
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
.NullReferenceException
? aber esint?
ist keinReference
, es ist nur ein Wertint
, dernull
WertAntworten:
Sie beobachten die Auswirkungen eines angehobenen Bedieners .
Aus Abschnitt 7.3.7 der C # 5-Spezifikation:
a++
In diesem Fall handelt es sich also im Grunde genommen um einen Ausdruck mit dem Ergebnisnull
(alsint?
), und die Variable bleibt unberührt.Wenn du anrufst
Das wird eingerahmt
object
, wodurch es in eine Nullreferenz konvertiert wird, die als leere Zeile gedruckt wird.quelle
Console.WriteLine(a == null ? "null" : a)
?a
vom Typ istint?
, würde ich sagen,a ?? "null"
findet keinen gemeinsamen Typ für die beiden Operanden. Sie benötigen einen Hinweis,object
der der übliche Typ ist. Wirf also einen der beiden Operanden darauf. Dasa
wird verpackt. Zum Beispiel((object)a) ?? "null"
odera ?? (object)"null"
.Jons Antwort ist richtig, aber ich würde einige zusätzliche Notizen hinzufügen.
Es gibt 19 Überladungen von
Console.WriteLine
und drei davon sind auf a anwendbarnull
: die, die a nimmtstring
, die, die a nimmtchar[]
und die, die a nimmtobject
. 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.a
ist eine Nullint?
. Die Überlastungsauflösung wählt dieobject
Version der Methode aus, sodass dieint?
Box auf eine Nullreferenz gesetzt wird. Das ist also im Grunde dasselbe wie dasConsole.WriteLine((object)null)
, was eine leere Zeile schreibt.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.quelle
Diese Aussage bedeutet einfach
null++
null + 1.Gemäß diesem Dokument kann ein nullbarer Typ den korrekten Wertebereich für den zugrunde liegenden Wertetyp sowie einen zusätzlichen Nullwert darstellen. Einem nullbaren Wert, ausgesprochen "Nullable von Int32", kann ein beliebiger Wert von -2147483648 bis 2147483647 zugewiesen werden kann der Nullwert zugewiesen werden
Hier erhöhen Sie null, dann wird es auch null, nicht 0 oder eine andere ganze Zahl.
Wenn Sie einen nullbaren Typ mit einem Nullwert drucken, wird dieser anstelle eines Fehlers leer gedruckt, da Sie eine Variable drucken, dh den Wert eines Speicherorts. was vielleicht null oder eine ganze Zahl ist.
Wenn Sie jedoch versuchen, null mit zu drucken
Console.WriteLine(null)
, ist null keine Variable und bezieht sich daher nicht auf einen Speicherort. Und daher gibt es Fehler"NullReferenceException"
.In diesem Fall wird 2 an einer temporären Stelle gespeichert, und der Zeiger zeigt auf diese zu druckende Speicherstelle.
quelle