在我们的代码中尝试过类似的操作,但失败了:
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>
to System.Func<Person, Employee>
。存在显式转换(您是否缺少强制转换?)
知道为什么吗?
如果您查看签名Func<T, TResult>
,你会看到输入参数(T
在这种情况下)是逆变,以及返回类型(TResult
) is 协变
public delegate TResult Func<in T, out TResult>(T arg);
逆变基本上是关于能够将“较大”类型传递给期望“较小”类型的方法,而协变则恰恰相反。
埃里克·利珀特 (Eric Lippert) 指出美丽而优雅(强调我的) https://blogs.msdn.microsoft.com/ericlippert/2009/11/30/whats-the-difference-between-covariance-and-assignment-compatibility/:
通用类型 I 是协变(在T中)if构造参考
类型参数保留赋值兼容性的方向。它
是逆变(在 T 中)如果反转赋值方向
兼容性。它是不变的 if it 两者都不做。至此,我们
只是简单地说,采用 T 的投影
并产生 I 是协变/逆变/不变投影。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)