C # Casting Generics (Kovarianz und Kontravarianz?)

8

Ich brauche dazu einen Rat / Hilfe, ich kann das Holz von den Bäumen nicht mehr sehen.

Es ist eine geradlinige Reihe von Klassen, die einige Schnittstellen unter Verwendung von Generika implementieren.

Dann versuche ich, die konkreten Typen zum Beispiel zu werfen:

%Vor%

// Ungültige Umwandlung

Ich habe einige Artikel über Kovarianz und Kontravarianz gelesen, aber nicht zu deutlich, warum dies nicht möglich ist oder wie man es umgehen kann?

Also, in diesem Beispiel:

%Vor%

würde nicht funktionieren ...

.... weil Sie die Activity-Eigenschaft nicht abrufen und festlegen können.

In diesem Beispiel musste ich Folgendes tun:

%Vor%

hoffe, dass jemand hilft, und danke an alle für die Hilfe!

    
sambomartin 06.12.2011, 14:45
quelle

2 Antworten

9

Dies ist nur möglich, wenn Sie der Schnittstelle einen Kovariantenparameter ( out ) zuweisen. Das können Sie nur tun, wenn der Parameter covariant verwendet wird.

Wenn zum Beispiel die Schnittstelle IMyGenericObject<T> eine Methode hat, die einen T -Parameter verwendet, verhindert dies, dass Sie den Parameter als Kovariante deklarieren. Umgekehrt, wenn es eine Methode gibt, die T zurückgibt, verhindert dies, dass Sie den Parameter als kontravariant deklarieren.

BEARBEITEN

Als Antwort auf Ihren Kommentar zu SLaks 'Antwort bin ich versucht, alles zu wiederholen, was Eric Lippert je über Co- und Kontravarianz geschrieben hat. Siehe Ссылка und auch seine Antworten in SO (zuletzt Ссылка )

Zusammenfassend:

Sie können IList<string> nicht auf IList<object> anwenden, weil es legal ist, ein FileInfo an ein IList<object> zu übergeben, aber es ist nicht legal, es an ein IList<string> zu übergeben.

Sie können IList<object> nicht auf IList<string> umwandeln, da es legal ist, ein Element aus einem IList<string> abzurufen und einem String-Verweis zuzuweisen, aber ein IList<object> könnte ein FileInfo enthalten, was nicht einer String-Referenz zugewiesen.

BEARBEITEN 2

Da Sie um Rat gefragt haben, ist es auch möglich, Ihre Schnittstellen in ko- und kontravariante Teile aufzuteilen. Um mit dem Listenbeispiel fortzufahren, könnten Sie diese Schnittstellen haben

%Vor%

Damit können Sie die Klasse abhängig vom Kontext kovariant oder konträr verwenden.

    
phoog 06.12.2011, 14:52
quelle
4

Sie müssen die Schnittstelle als einen kovarianten ( out ) generischen Parameter deklarieren.

    
SLaks 06.12.2011 14:47
quelle

Tags und Links