Gibt null von der generischen Methode zurück

8

Wie gebe ich Nullwert von einer generischen Methode zurück?

%Vor%     
Alexandre 07.03.2011, 20:18
quelle

6 Antworten

11

default(T) funktioniert in beiden Fällen.

    
BrokenGlass 07.03.2011, 20:18
quelle
4

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.

    
RQDQ 07.03.2011 20:20
quelle
2

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.

    
CodesInChaos 07.03.2011 20:21
quelle
2

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:

%Vor%     
thecoop 07.03.2011 20:31
quelle
1

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.

    
JaredPar 07.03.2011 20:22
quelle
0

Um zu sehen, warum dies nicht möglich ist, ersetzen Sie T durch einen Werttyp:

%Vor%

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) .

    
Davy8 07.03.2011 20:30
quelle

Tags und Links