我在NDC 2010上看到了Jon Skeet的演讲
他提到了一些有趣的事
public Class Base
{
public void Foo(IEnumerable<string> strings){}
}
public Class Child:Base
{
publc void Foo(IEnumerable<object> objects) {}
}
Main :
List<string> lst = new List<string>();
lst.Add("aaa");
Child c = new Child();
c.Foo(lst);
Run Code Online (Sandbox Code Playgroud)
使用C#3,它将调用: Base.Foo
使用C#4,它将调用: Child.Foo
我知道这是因为协方差
题 :
是不是有点代码破坏变化?有没有解决方法,所以这段代码将继续像第3版那样工作?
(再次烦人的问题......)
之前问过这个 - (这部分与我的问题有关) - 我得到了一个答案:
参见C#4规范的§7.6.5.1:
候选方法集合被简化为仅包含来自大多数派生类型的方法:对于集合中的每个方法CF,其中C是声明方法F的类型,所有在基本类型C中声明的方法都从集合.
好.
我有这个代码://.Dump() is like a WriteLine command...
public class Base
{
public void Foo(string strings) { "1".Dump();}
public virtual void Foo(object strings) { "2".Dump();}
}
public class Child : Base
{
public override void Foo(object strings) { "4".Dump();}
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码:
Child c = new Child();
c.Foo("d");
Run Code Online (Sandbox Code Playgroud)
发出: "1"
可是等等 ...
我们不这么说is reduced to contain only methods from the most derived types:吗?
Child的父亲有一个函数public void Foo(string strings) …