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 ..!
Generische Kontravarianz erlaubt nicht Ihnen, einen Delegaten D<TDerived>
einem Delegaten D<TBase>
zuzuweisen, weil der unten gezeigte Grund (hier Action<T1>
) verwendet wird:
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
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? :)
Tags und Links c# covariance expression contravariance expression-trees