cercato di qualcosa di simile nel nostro codice ma non riesce:Funz contrasto con più parametri
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 { }
Gli ultimi due casi che danno questo errore:
Cannot implicitly convert type
System.Func<Employee, Employee>
toSystem.Func<Person, Employee>
. An explicit conversion exists (are you missing a cast?)
Qualsiasi idea del perché?
Poiché il tipo di ritorno (l'ultimo parametro generico di 'Func <>') è covariante, mentre i parametri di input (tutti gli altri parametri generici di 'Func <>') sono controvarianti. – xanatos
Fatto divertente: le conversioni dei * gruppi di metodi * ai delegati sono anche covarianti e controvarianti allo stesso modo. Se hai 'Giraffe M (Animale a)' e 'delegato Animale D (Tigre t)' allora 'D d = M;' è legale in C#, anche se D non è nemmeno generico. –