4

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

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);lstIEnumerable字符串!) -

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

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

4

1 回答 1

5

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

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

请参阅 C# 4 规范的第 7.6.5.1 节:

候选方法集减少为仅包含来自最派生类型的方法:对于集中的每个方法 CF,其中 C 是声明方法 F 的类型,从 C 的基类型中声明的所有方法都将从中删除集。

于 2012-05-05T12:57:35.220 回答