Ich hoffe, die Frage ist richtig, also lassen Sie uns ein Beispiel geben. Stellen Sie sich die folgende generische Methode vor:
%Vor% Laut dem MSDN beschränkt das Schlüsselwort where
den Typ-Parameter T
auf vom Typ Base
sein oder von dieser Klasse erben.
[...] Eine where-Klausel kann eine Basisklassenbeschränkung enthalten, die angibt, dass ein Typ die angegebene Klasse als Basisklasse haben muss (oder selbst diese Klasse sein muss), um als Typargument dafür verwendet zu werden generischer Typ.
Auch dieser Code kompiliert:
%Vor% Wenn Sie also dem letzten Code folgen, sollte typeof(T)
Base
zurückgeben, oder? Warum druckt Visual Studio diese Warnung dann an mich?
warning CS0184: Der angegebene Ausdruck gehört niemals zum bereitgestellten ('Demo.Base') Typ.
typeof(whatever)
gibt immer eine Instanz vom Typ Type
zurück. Type
stammt nicht von Base
.
Was Sie wollen, ist das:
%Vor%Etwas, das so aussieht, ist das gleiche:
%Vor% Aber das hat eine andere Bedeutung.
Die erste Anweisung (mit typeof(Base)
) ist nur true
, wenn T
Base
ist. Es wird false
für jeden von Base
abgeleiteten Typ sein.
Die zweite Anweisung ( variableOfTypeT is Base
) ist immer true
in Ihrer Klasse, weil jede von Base
abgeleitete Klasse true
für eine Überprüfung ihrer Basisklasse zurückgibt.
So überprüfen Sie die Vererbung nicht.
typeof(T)
ist vom Typ System.Type
, es ist nicht Base
. Um herauszufinden, ob T von Base abgeleitet ist, sollten Sie die Methode IsSubclassOf verwenden das:
Tags und Links c# visual-studio generics type-parameter