etwas versucht, wie dies in unserem Code aber es funktioniert nicht:Func Varianz mit mehreren Parametern
Func<Employee, Employee> _myFunc;
void Main()
{
Func<Employee, Employee> test1 = _myFunc;//Ok
Func<Employee, Person> test2 = _myFunc;//Ok
Func<Person, Employee> test3 = _myFunc;//Fails
Func<Person, Person> test4 = _myFunc;//Fails
}
public class Person { }
public class Employee : Person { }
Die letzten beiden Fälle geben diesen Fehler:
Cannot implicitly convert type
System.Func<Employee, Employee>
toSystem.Func<Person, Employee>
. An explicit conversion exists (are you missing a cast?)
Jede Idee, warum?
Da der Rückgabetyp (der letzte allgemeine Parameter von 'Func <>') ist covariant, während die Eingangsparameter (alle die anderen generischen Parameter von 'Func <>') sind kontravariant. – xanatos
Wissenswertes: Konvertierungen von * Methodengruppen * zu Delegaten sind in gleicher Weise auch kovariant und kontravariant. Wenn Sie "Giraffe M (Animal a)" und "delegiere Animal D (Tiger t)" haben, dann ist "D d = M;" in C# zulässig, obwohl D nicht einmal generisch ist. –