方差不适用于具有引用类型的代理

And*_*rey 2 .net c# c#-4.0

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)

为什么价值类型在这里很特别?违约是否与价值类型相违背?

Jon*_*eet 6

通用方差仅适用于引用类型,是的.(这是为了让CLR知道,一切都还只是一个参考,所以实时编译的代码还是一样......参与了参考位是什么类型你所谈论的是相同的,而治疗intobject需要装箱转换基本上你可以用参考类型保持代表性身份.

从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存在身份转换

它是"隐式引用转换"而不仅仅是"隐式转换"位,这是值类型的问题.

对于很多围绕通用方差详情见埃里克利珀的关于这个专题的博客系列.

  • @Andrey:"因为规范"意味着决定是任意的,但事实并非如此.Jon解释了为什么不:因为int和object不是*兼容*类型.返回int的函数不能用作返回对象的函数,因为返回int的函数会将32位整数写入返回存储,而返回对象的函数会写入一个64位的指针,指向堆分配的对象进入返回存储.存储*尺寸*要求甚至不相同,因此类型不兼容. (3认同)