Roy*_*mir 4 c# inheritance .net-4.0 covariance
老实说 - 我问过(这个问题的一部分), 但现在我有一个不同的相关问题.
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);
Run Code Online (Sandbox Code Playgroud)
(N C#3它将调用:Base.Foo
在C#4它将调用:Child.Foo)
我在FW4!, 让我们来谈谈它
尊重协方差:当我写作 c.Foo(lst);( lst是IEnumerableSTRING!) -
它看到两个签名!但仍然 - 它选择IEnumerable<object>??
协方差比具体类型本身更强吗?
这不是因为协方差更强,而是因为C#首先选择"更接近"的方法.因此,它看Child.Foo(),决定它是适用的(感谢协方差),甚至没有看Base.Foo().
这里的假设是特定类型"知道"更多,因此应首先考虑其方法.
参见C#4规范的§7.6.5.1:
候选方法集合被简化为仅包含来自大多数派生类型的方法:对于集合中的每个方法CF,其中C是声明方法F的类型,所有在基本类型C中声明的方法都从集合.