C # Werttyp initialisiert mit null

7

In C # 3.0 können Sie int null zuweisen? type (in CLR int? ist eine Struktur):

%Vor%

, aber wenn Sie eine benutzerdefinierte Struktur definieren:

%Vor%

Bei der Kompilierung dieses Codes ist ein Fehler aufgetreten:

%Vor%

Der Fehler ist wie folgt:

%Vor%

Während int? ist eine Struktur in CLR es ist irgendwie nicht intuitiv, dass wir ihm null zuweisen können. Ich nehme an, dass Null implizit zu einem certian int geworfen oder eingerahmt wird? Wert, der den Nullwert darstellt. Wie wird es genau gemacht? Wie kann ich MyStruct so erweitern, dass die Zeile ausgeführt werden kann:

%Vor%     
mgamer 24.11.2010, 18:11
quelle

3 Antworten

20

Es liegt daran, dass int? tatsächlich eine Kurzschrift Nullable<int> ist. Sie können dasselbe für Ihren Typ auch tun:

%Vor%

null kann nur implizit in einen nullbaren -Typ konvertiert werden, was einen beliebigen Referenztyp oder einen beliebigen Nullwerttyp bedeutet - wobei Letzterer Nullable<T> für einige T bedeutet.

Beachten Sie, dass diese Konvertierungsfunktion von null wirklich eine Sprache ist - der Compiler konvertiert dies:

%Vor%

in

%Vor%

Sie meinen das Gleiche - im Grunde ist ein "Null" -Wert für einen nullbaren Werttyp ein Wert, bei dem HasValue falsch ist, was er standardmäßig ist. Es ist nicht das gleiche wie eine Null -Referenz - obwohl das Eingeben eines Nullwerts wie dieser zu führt, wird eine Nullreferenz erzeugt.

(Dies ist ein Beispiel für ein Feature, das Sprach-, Bibliotheks- und CLR-Grenzen überschreitet. Der Bibliotheksteil ist ziemlich einfach, der CLR-Teil hat nur mit Boxen und Unboxing zu tun - aber es gibt eine Menge an angehobenen Operatoren in der Sprache.)

    
Jon Skeet 24.11.2010 18:13
quelle
2

Structs sind Werttypen in C #, keine Referenztypen, daher können sie nicht null sein.

%Vor%

funktioniert, aber denken Sie daran, dass Strukturen als Beispiel unveränderlich sind:

%Vor%     
Master Morality 24.11.2010 18:14
quelle
1

nur hinzufügen, ein Nullable-Typ kann den normalen Wertebereich für den zugrunde liegenden Werttyp plus einen zusätzlichen Nullwert darstellen.

In der Notation ist Int genauso wie Int Int32, nicht Int, die? Zeichen bedeutet NULL-Wert. Nullable, in diesem Fall.

Ссылка

    
marcelo-ferraz 24.11.2010 18:14
quelle

Tags und Links