协方差胜过具体类型?
说实话 – 我问过(这个问题的一部分) ,但现在我有一个不同的相关问题。
public class Base { public void Foo(IEnumerable strings) { } } public class Child : Base { public void Foo(IEnumerable objects) { } } List lst = new List(); lst.Add("aaa"); Child c = new Child(); c.Foo(lst);
(在C#3中它将调用:C#4中的Child.Foo
将调用: Child.Foo
)
我在FW4! , 让我们来谈谈它
所有对协方差的尊重:当我写c.Foo(lst);
(我是STRING的IEnumerable
!) –
它看到两个签名! 但仍然 – 它选择IEnumerable
??
协方差比具体类型本身更强吗?
这不是因为协方差更强,而是因为C#首先选择“更接近”的方法。 因此,它查看Child.Foo()
,确定它是适用的(感谢协方差),甚至不查看Base.Foo()
。
这里的假设是特定类型“知道”更多,因此应首先考虑其方法。
参见C#4规范的§7.6.5.1:
候选方法集合被简化为仅包含来自大多数派生类型的方法:对于集合中的每个方法CF,其中C是声明方法F的类型,所有在基本类型C中声明的方法都从集合。