协方差胜过具体类型?

时间:2012-05-05 12:52:52

标签: c# inheritance .net-4.0 covariance

老实说 - 我问过(这个问题的一部分)here 但现在我有一个不同的相关问题。

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是STRING的IEnumerable!) -

它看到两个签名!但仍然 - 它选择IEnumerable<object> ??

协方差是否比具体类型本身更强?

1 个答案:

答案 0 :(得分:5)

这不是因为协方差更强,而是因为C#首先选择“更接近”的方法。因此,它会查看Child.Foo(),确定它适用(感谢协方差),甚至不会查看Base.Foo()

这里假设特定类型“知道”更多,因此应首先考虑其方法。

参见C#4规范的第7.6.5.1节:

  

候选方法集被简化为仅包含来自大多数派生类型的方法:对于集合中的每个方法CF,其中C是声明方法F的类型,所有方法都在C的基本类型中声明从集合中移除。