2010-02-03 2 views

Antwort

39

Technisch ist "ndate" nicht null - es ist ein Werttyp, dessen Wert als null angegeben ist. Wenn Sie DateTime? schreiben, ist dies nur eine Abkürzung für Nullable<DateTime>, die eine Struktur ist. Dies kann technisch nicht null sein, da es sich nicht um einen Referenztyp handelt.

+0

+1 beste Erklärung. – JonH

+1

Ich nehme dann an, dass (ndate == null) funktioniert über einen überladenen Operator? – Nathan

+0

@Nathan wahr 15 Zeichen – JonH

-4

Synctactic Zucker mein Freund ... der Compiler dreht, dass .HasValue Anruf in Code, der nicht eine Ausnahme :-)

+0

Nicht wirklich wahr - die ndate-Variable ist technisch nie "null", da es ein Werttyp ist und nicht null sein kann. Es hat einen Wert von null, was sehr unterschiedlich ist. –

+0

Eigentlich macht der Compiler "ndate = null" zu "ndate = new Nullable ()' – Greg

2

wirklich passiert ist, was werfen, dass eine tatsächliche (nicht null) Nullable Struktur zugewiesen wird zu der Variable, also ist die Variable nicht null, aber es ist Wert ist.

+0

Nun ... wirklich, sogar sein * value * ist nicht null, da 'Nullable ' hat eine 'wo T: struct 'Einschränkung, richtig? Ich nehme an, es ist nur eine Flagge auf der Innenseite. –

7

Die Nullable<T> ist eine Struktur, im Grunde kann es keinen null Wert halten.

Ihre Aufgabe ist tatsächlich in etwas zusammengestellt, die wie folgt aussieht:

Nullable<DateTime> ndate = new Nullable<DateTime>(); 

Ein weiteres Beispiel ist der Ausdruck:

int? a = null; 

wird die folgende IL generieren:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) 
IL_0000: ldloca.s V_0 
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

Ein Aufruf an die initobj Operation, die jedes Feld der AV initialisiert Geben Sie an einer angegebenen Adresse einen NULL-Verweis oder eine 0 des entsprechenden primitiven Typs ein.

Abschließend, was hier passiert ist die Standardeinstellung struct initialization.

6

ich hätte eine Nullreferenceexception

Es gibt keine Null Referenz erwartet dereferenziert wird, so „Nullreferenceexception“ sollte nicht zu erwarten. Die Nullable DateTime ist keine Nullnummer . Es ist ein Nullwert.

Da ndate jedoch null ist, wie ist der Eigenschaftsaufruf erfolgreich, da kein Objekt zum Aufrufen der Eigenschaft HasValue vorhanden ist?

Die Frage setzt eine falsche Prämisse voraus. Es gibt ein Objekt. Es gibt eine Nullable DateTime, die den Nullwert einer Nullable DateTime darstellt. Dieser Wert ist ein Objekt.

Betrachten Sie Ihren Code:

DateTime? ndate = null; 
Console.WriteLine(ndate.HasValue); 

Dies ist nur ein kurzer Weg, etwas zu schreiben, das logisch wie ist:

DateTime ndate = default(DateTime); 
bool ndateHasValue = false; 
Console.WriteLine(ndateHasValue); 

Ein Nullable-Wertetyp ist einfach eine angenehme Art und Weise zu Code zu schreiben, das Mittel msgstr "Bitte fügen Sie diesem Ding einen Booleschen Wert bei, der verfolgt, ob es logisch null ist oder nicht".

Verwandte Themen