【发布时间】:2016-03-15 09:18:01
【问题描述】:
在我们的代码中尝试过这样的事情,但失败了:
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 { }
最后两种情况给出了这个错误:
无法将类型
System.Func<Employee, Employee>隐式转换为System.Func<Person, Employee>。存在显式转换(您是否缺少演员表?)
知道为什么吗?
【问题讨论】:
-
因为返回类型(
Func<>的最后一个泛型参数)是协变的,而输入参数(Func<>的所有其他泛型参数)是逆变的。 -
有趣的事实:方法组到委托的转换也是协变和逆变的。如果您有
Giraffe M(Animal a)和delegate Animal D(Tiger t),那么D d = M;在C# 中是合法的,即使D 甚至不是通用的。
标签: c# covariance func