协方差胜过混凝土类型
本文关键字:类型 混凝土 方差胜 | 更新日期: 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 的基类型声明的所有方法都将从集合中删除。