2013-09-03 12 views
5

Der Typ Nullable<T> ist definiert als struct. In .Net können Sie null nicht einem struct zuweisen, da structs Werttypen sind, die nicht mit null (mit Ausnahme von Nullable<T>) dargestellt werden können.Wie lässt sich das Setzen von Nullwerten mit .Net auf Null setzen

int i = null; // won't compile - we all know this 
int? i = null; // will compile, and I'm glad it does, and it should compile, but why? 

Wie haben Nullable<T> werden eine Ausnahme von der Regel „Man kann nicht null auf einen Wert zuordnen kann?“ Der dekompilierte Code für Nullable<T> bietet keine Erkenntnisse darüber, wie dies geschieht.

+0

mögliche Duplikate von [wie sind NULL-fähige Typen unter der Haube in .net implementiert?] (Http://stackoverflow.com/questions/2503811/how-are-nullable-types-implemented-under-the-hood-in -net) –

Antwort

13

Wie wurde Nullable<T> eine Ausnahme von der Regel "Sie können einem Werttyp null nicht zuweisen?"

Durch die Änderung der Sprache, im Grunde. Das null Literal wurde von "Nullreferenz" zu "Nullwert des relevanten Typs".

Zur Ausführungszeit „der Nullwert“ für eine Nullable-Wertetyp ist ein Wert, bei dem die HasValue Eigenschaft false zurückgibt. So folgt aus:

int? x = null; 

entspricht:

int? x = new int?(); 

Es lohnt sich, die Rahmen Teile Nullable<T> der Sprache und CLR Aspekte zu trennen. Tatsächlich braucht die CLR selbst nicht viel über Nullable-Werttypen zu wissen - soweit ich weiß, ist der einzige wichtige Aspekt, dass der Null-Wert eines Nullable-Werttyps in eine NULL-Referenz eingereiht wird, und Sie können entpacken Sie einen Null-Verweis auf den Nullwert eines Nullwerttyps. Auch das wurde erst kurz vor der endgültigen Version von .NET 2.0 eingeführt.

Die Sprachunterstützung hauptsächlich besteht aus:

  • syntaktischen Zucker in Form von ? so int? entsprechen Nullable<int>
  • Lifted operators
  • Die veränderte Bedeutung von null
  • Der Null-Koaleszenz-Operator (??) - die nicht auf Nullwerttypen beschränkt ist
+3

@Dan: Wenn Sie viel mehr Details wünschen, widme ich NULL-Werttypen in C# ein ganzes Kapitel :) –

+0

@JonSkeet Also, was würde es brauchen, um 'int i = null;' äquivalent zu 'int i = neues int(); '? – Dan

+0

Ich Laufzeit annehmen wird nur gesetzt 'HasValue' Eigenschaft auf false, wenn wir setzen' int i = null; 'Bin ich richtig @ Jon –