Warum warnt mich VS, dass typeof (T) niemals der angegebene Typ in einer generischen Methode ist, bei der der Typparameter darauf beschränkt ist, T zu implementieren?

8

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.

    
Carsten 13.02.2013, 13:28
quelle

2 Antworten

13

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.

    
Daniel Hilgarth 13.02.2013, 13:30
quelle
1

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:

%Vor%     
zmbq 13.02.2013 13:33
quelle