default(T)
funktioniert in beiden Fällen, aber seine Bedeutung ist für Werttypen etwas unterschiedlich. Es gibt buchstäblich den Standardwert des Typs zurück. Im Fall von Method<int>
wird 0
zurückgegeben, nicht null
.
UPDATE: Gegebene Methodensignatur:
%Vor% Sie können bei einem Werttyp Nullable<T>
nicht zurückgeben und bei einem Referenztyp T
eingeben. Das müssten zwei verschiedene Methoden sein.
Offensichtlich können Sie null
nur zurückgeben, wenn der Rückgabetyp entweder Nullable<T>
oder ein Referenztyp ist. Normale Werttypen haben keine null
.
Bei den Referenztypen default(T)
ist null
und für Nullable<T>
ebenfalls null. Sie können default(T)
also in beiden Fällen verwenden, in denen null
existiert.
Wenn der Typ ein anderer Wert ist, dann ist default(T)
nicht null
, aber da es keine null
gibt, würde das sowieso keinen Sinn ergeben.
Es ist nicht möglich, einfach eine Methode mit dem Rückgabetyp T
zu haben, wenn T
ein Referenztyp / Nullable<T>
und T?
für normale Werttypen ist.
Man könnte versuchen, so etwas zu definieren, aber es wird nicht kompiliert, weil der Compiler nicht versteht, dass sich die generischen Constraints gegenseitig ausschließen. Es berücksichtigt lediglich keine generischen Einschränkungen.
%Vor%Sie müssen diese Methoden auf andere Weise anders machen. Entweder mit anderen Namen oder anderen Parametern.
Wenn Sie T?
zurückgeben möchten, wenn es sich um einen Werttyp handelt, müssen Sie zwei separate Methoden verwenden. Es gibt jedoch eine Komplexität, da Methoden sich nicht nur durch ihren Rückgabetyp unterscheiden können (es gibt auch Probleme in Bezug auf die generischen Argumente, die nicht Teil einer Methodensignatur sind). Sie müssen also einen 'stub'-Methodenparameter angeben, mit dem der Compiler auflöst, welche Methode aufgerufen werden soll:
Es ist nicht legal, null
für einen unbeschränkten T
Wert zurückzugeben. Stellen Sie sich zum Beispiel vor, wenn T
als Werttyp instanziiert wird. In diesem Fall wäre null
kein zulässiger Wert und daher ist der Code illegal.
Was Sie suchen, ist default(T)
. Dies funktioniert sowohl für Wert- als auch für Referenztypen. Für Referenztypen wird null
erzeugt und für Werttypen wird der initialisierte Nullwert erzeugt.
Um zu sehen, warum dies nicht möglich ist, ersetzen Sie T
durch einen Werttyp:
Wenn der Rückgabetyp int ist, können Sie null
nicht zurückgeben, weil es kein gültiger Wert ist. Der Typ von T müsste an erster Stelle nullbar sein, in diesem Fall funktioniert default(T)
.