Kontravarianz in Expressions

8

Ich versuche, einen Delegierten für allgemeine Aktionen zu erstellen

%Vor%

und

%Vor%

und hier ist mein Anrufer

%Vor%

und hier ist das Geschäftsobjekt

%Vor%

und hier ist der Fehler, den ich während der Kompilierung bekommen habe

%Vor%

Meine GetSetterAction gibt ActionPerdicate zurück, wobei T hier busPerson ist und ich versuche, es in ActionPredicate zu speichern, wobei ich auf Kontravarianz achten muss. Aber es scheitert. Ich weiß nicht, wie ich weiter vorgehen soll. Bitte Hilfe ..!

    
kans 11.04.2012, 07:42
quelle

1 Antwort

8

Generische Kontravarianz erlaubt nicht Ihnen, einen Delegaten D<TDerived> einem Delegaten D<TBase> zuzuweisen, weil der unten gezeigte Grund (hier Action<T1> ) verwendet wird:

%Vor%

Wie Sie sehen können, würden wir, wenn wir diese Aufgabe ausführen könnten, die Typsicherheit brechen, da wir versuchen könnten, den Delegaten m1 durch Übergabe und Instanz von object aufzurufen und nicht %Code%. Der umgekehrte Weg, d. H. Das Kopieren eines Delegiertenverweises auf einen Typ, dessen Parametertyp mehr abgeleitet ist als die Quelle, ist in Ordnung. MSDN enthält ein vollständigeres Beispiel für die generische Co / Kontra-Varianz .

Daher müssen Sie entweder die Deklaration von string in act ändern oder, wahrscheinlicher, erwägen, die ActionPredicate<busPerson, string> act Methode so zu schreiben, dass immer GetSetterAction zurückgegeben wird. Wenn Sie das tun, sollten Sie auch die Typbeschränkung

hinzufügen %Vor%

Um die Methode zu ändern, ändern Sie die ersten beiden Zeilen wie folgt:

%Vor%

Das Hinzufügen der generischen Einschränkung ist eine nette Geste, um sicherzustellen, dass dieser Downcast immer für ActionPredicate<busBase, string> gültig ist.

Etwas anders - was war mit dem Delegierten T1 falsch? Es scheint genau dasselbe zu tun wie deins? :)

    
Andras Zoltan 11.04.2012, 08:00
quelle