老实说,我问过(这个问题的一部分)here https://stackoverflow.com/questions/9335278/covariance-in-different-fw-causes-code-break但现在我有一个不同的相关问题。
public class Base
{
public void Foo(IEnumerable<string> strings) { }
}
public class Child : Base
{
public void Foo(IEnumerable<object> objects) { }
}
List<string> lst = new List<string>();
lst.Add("aaa");
Child c = new Child();
c.Foo(lst);
(n C# 3 它将调用:Base.Foo
在 C# 4 中它将调用:Child.Foo
)
我在FW4! , 让我们来谈谈它
尊重协方差:
当我写的时候c.Foo(lst);
( lst
is IEnumerable
STRING!)-
it sees both签名!!!但仍然 - 它选择IEnumerable<object>
??
协方差比具体类型本身更强吗?
这并不是因为协方差更强,而是因为 C# 首先选择“更接近”的方法。所以,它看起来Child.Foo()
,决定它是适用的(感谢协方差)并且甚至不看Base.Foo()
.
这里的假设是特定类型“知道”更多,因此应首先考虑其方法。
请参阅 C# 4 规范的第 7.6.5.1 节:
候选方法集被简化为仅包含来自最派生类型的方法:对于集合中的每个方法 C.F(其中 C 是声明方法 F 的类型),在 C 的基类型中声明的所有方法都将从中删除该集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)