2012-12-10 12 views
15

Mögliche Duplizieren:
Nullable type as a generic parameter possible?Warum Nullable <T> nicht als Referenztyp für generische Einschränkungen entsprechen

ich auf eine sehr seltsame Sache mit generischen Typ Einschränkungen kam. Ich habe eine Klasse wie folgt:

public SomeClass<T> where T:class 
{ 
} 

aber ich gefunden habe ich nicht auf NULL festlegbaren Typen verwenden kann, wie ich erwarten würde:

new SomeClass<int?>(); 

ich einen Fehler, dass int? eine Referenz sein muss Art. Ist Nullable wirklich nur eine Struktur mit syntaktischem Zucker, damit es wie ein Referenztyp aussieht?

+2

Was ist der Grund für diese Einschränkung? Können Sie mehr Kontext bereitstellen? FYI Nullable wird wie folgt deklariert: 'public struct Nullable wo T: struct ' –

+0

@SimonWhitehead im Grunde, weil die Verwendung von Werttypen in dieser Klasse kann unerwartetes Verhalten haben und große Auswirkungen Auswirkungen – Earlz

+1

Dann denke ich die gerade Antwort ist" Ja, Nullable ist ein Struktur ". Ich bin mir nicht ganz sicher, was Sie für Nullable als syntaktischen Zucker halten. Es scheint, dass Ihre einzige Möglichkeit ist, Ihre eigenen zu rollen. –

Antwort

20

Nullable<T> ist ein struct (siehe MSDN) jedoch ist es die einzige, die nicht den structstruct Constraint nicht erfüllt. Daher können Sie Nullable nicht als generischen Typparameter verwenden, wenn entweder class oder struct Einschränkungen verwendet werden.

Nullable<T> ist nicht nur eine Struktur mit etwas syntatic Zucker. Es hat spezielle Unterstützung in der CLR für einige seiner Verhaltensweisen. Zum Beispiel hat es spezielles Boxverhalten. Insbesondere wird ein NULL-Zeichen niemals eingerahmt. Der zugrunde liegende Wert ist eingerahmt. Wenn der Nullwert der Nullwert ist (HasValue ist false), wird er in einen Nullverweis konvertiert. Außerdem werden die Umwandlungsoperatoren für alle Nullable<T> bis Nullable<U> von den Umwandlungen von T zu U aufgehoben. Dies sind Funktionen, die Sie in .NET 1.0/1.1 nicht selbst implementieren können.