a)编译
Func<string, bool> f1 = (Func<object, bool>)null;
Run Code Online (Sandbox Code Playgroud)
b)不是
Func<int, bool> f2 = (Func<object, bool>)null;
Run Code Online (Sandbox Code Playgroud)
为什么价值类型在这里很特别?违约是否与价值类型相违背?
通用方差仅适用于引用类型,是的.(这是为了让CLR知道,一切都还只是一个参考,所以实时编译的代码还是一样......参与了参考位是什么类型你所谈论的是相同的,而治疗int的object需要装箱转换基本上你可以用参考类型保持代表性身份.
从C#4规范,第13.1.3.2节:
如果T是使用变体类型参数声明的接口或委托类型,则类型
T<A1, …, An>是方差可转换为类型,并且对于每个变体类型参数Xi,以下中的一个成立:T<B1, …, Bn>T<X1, …, Xn>
- Xi是协变的,并且从Ai到Bi存在隐式参考或身份转换
- Xi是逆变的,并且从Bi到Ai存在隐式参考或身份转换
- Xi是不变的,并且从Ai到Bi存在身份转换
它是"隐式引用转换"而不仅仅是"隐式转换"位,这是值类型的问题.
对于很多围绕通用方差详情见埃里克利珀的关于这个专题的博客系列.