Erläuterungen zu C # -Generika und Nullable-Werttypen. Gibt null oder nullable zurück

8

Angenommen, ich habe die folgende Klasse:

%Vor%

Irgendwo möchte ich meine Klasse mit T mit einem class spezialisieren, andere mit einem struct . Ich stehe vor diesem issue : Ich kann kein Nullable<T> zurückgeben, wenn T type nicht auf struct beschränkt ist.

Ich möchte eine Implementierung meiner Find -Methode bereitstellen, die funktioniert, wenn T sowohl auf class als auch auf struct spezialisiert ist. Wenn Find fehlschlägt, möchte ich null zurückgeben, wenn T eine Klasse ist, sonst Nullable<T> .

Ist das ohne Reflektion möglich? Wenn ja wie?

    
Heisenbug 30.10.2012, 16:27
quelle

3 Antworten

15

Sie können default(T) zurückgeben.

Für eine Klasse ist dies null . Für Nullable<T> ist dies ein Nullable<T> ohne einen Wert (effektiv null ).

Wenn Sie dies mit einem struct und nicht mit einem Nullable<T> als Typ verwenden, wird default(T) der Standardwert der Struktur sein.

Wenn Sie möchten, dass dies einheitlich für jede Klasse oder Struktur funktioniert, müssten Sie wahrscheinlich zwei Werte zurückgeben - Sie könnten das Framework hier als Inspiration verwenden und eine TryXXX-Methode verwenden, dh:

%Vor%

Sie könnten dann default(T) verwenden, wenn der Wert nicht gefunden wird, und false zurückgeben. Dies vermeidet die Notwendigkeit für NULL-fähige Typen. Sie könnten dies auch schreiben, indem Sie ein Tuple<bool, T> oder ähnliches zurückgeben, wenn Sie den out-Parameter vermeiden möchten, dh:

%Vor%

Eine letzte Option wäre möglicherweise, Ihre Klasse nicht generisch zu machen und dann ein Paar generischer Methoden zu verwenden:

%Vor%

Beachten Sie, dass Sie eindeutige Namen benötigen, da eine überladene Methode nicht ausschließlich auf dem Rückgabetyp basieren kann.

    
Reed Copsey 30.10.2012, 16:29
quelle
2

Ich würde die folgende Lösung verwenden:

%Vor%

Warum? Weil Nullable<T> nur eine Struktur akzeptiert und die obige Methode sowohl Klassen als auch Strukturen unterstützt.

    
Felix K. 30.10.2012 16:31
quelle
0

Wie Reed sagte, könntest du default(T) zurückgeben.

Meiner Meinung nach hat dies einen großen Nachteil: Wenn Ihre Methode angibt, dass default(T) zurückgegeben wird, wenn das Element nicht gefunden wurde, verlieren Sie die Möglichkeit, die Standardwerte für Werttypen zurückzugeben (z. B. 0 für% co_de zurückgeben) % könnte im Allgemeinen ein vollkommen gültiger Rückgabewert sein.)

Ich würde lieber so etwas machen

%Vor%     
Florian Greinacher 30.10.2012 16:45
quelle

Tags und Links