Próbowałem coś takiego w naszym kodzie, ale nie udaje:Func wariancji z wieloma parametrami
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 { }
dwóch ostatnich przypadkach dać ten błąd:
Cannot implicitly convert type
System.Func<Employee, Employee>
toSystem.Func<Person, Employee>
. An explicit conversion exists (are you missing a cast?)
jakiś pomysł, dlaczego?
Ponieważ typ zwracany (ostatni generyczny parametr 'Func <>') jest kowariantna, natomiast parametry wejściowe (wszystkie pozostałe ogólne parametry 'Func <>') są sprzeczne. – xanatos
Zabawny fakt: konwersje * grup metod * na delegatów są również kowariantne i sprzeczne w taki sam sposób. Jeśli posiadasz 'Giraffe M (Animal a)' i 'delegate Animal D (Tiger t)', to 'D d = M;' jest legalne w języku C#, chociaż D nie jest nawet generyczne. –