Cố gắng một cái gì đó như thế này trong mã của chúng tôi nhưng nó không thành công:Func không phù hợp với nhiều tham số
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 { }
Hai trường hợp cuối cùng cho lỗi này:
Cannot implicitly convert type
System.Func<Employee, Employee>
toSystem.Func<Person, Employee>
. An explicit conversion exists (are you missing a cast?)
Bất cứ ý tưởng tại sao?
Bởi vì kiểu trả về (các tham số chung cuối cùng của 'Func <>') là hiệp biến, trong khi các thông số đầu vào (tất cả các tham số chung khác của 'Func <>') là contravariant. – xanatos
Thực tế thú vị: các chuyển đổi của * nhóm phương thức * đối với các đại biểu cũng là biến thể và biến đổi theo cùng một cách. Nếu bạn có 'Giraffe M (Animal a)' và 'delegate Animal D (Tiger t)' thì 'D d = M;' là hợp pháp trong C#, mặc dù D thậm chí không chung chung. –