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?
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:
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.
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%