协方差胜过混凝土类型

本文关键字:类型 混凝土 方差胜 | 更新日期: 2023-09-27 18:33:12

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

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是字符串的IEnumerable! -

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

协方差比混凝土类型本身强吗?

协方差胜过混凝土类型

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

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

请参阅 C# 4 规范的 §7.6.5.1:

候选方法集将缩减为仅包含派生类型最多的方法:对于集合中的每个方法 C.F(其中 C 是声明方法 F 的类型),以 C 的基类型声明的所有方法都将从集合中删除。