派生方法比c#中的覆盖更强?

Roy*_*mir 4 .net c# clr .net-4.0

(再次烦人的问题......)

之前问过这个 - (这部分与我的问题有关) - 我得到了一个答案:

参见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)和一个NEARER覆盖函数.

那他为什么选择它的基地功能呢?继承的函数是否比覆盖更复杂?

是否与覆盖在运行时有关?

请帮忙.

编辑

这种情况怎么样?

public class Base
    {    
        public virtual void  Foo(int x)  { "1".Dump();}
    }

    public class Child : Base
    {
        public override void  Foo(int x)  { "2".Dump();}
        public void Foo(object x) { "3".Dump();}    
    }

void Main()
{
    Child c = new Child();
    c.Foo(6); //emits "3"
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*wal 6

那是因为你的孩子拿走了一个物体.

public class Child : Base
{
    public override void Foo(object strings)  { "4".Dump();}
}
Run Code Online (Sandbox Code Playgroud)

使它成为字符串,然后将调用其中一个.

public class Child : Base
{
    public override void Foo(string strings)  { "4".Dump();}
}
Run Code Online (Sandbox Code Playgroud)

为什么这个?

因为编译器看到子进程有参数,object所以必须转换为string基类时它可以作为字符串使用.

所以它称之为基础.

虽然重写功能在子类中更接近.但是这里的规则在孩子和基础上是不同的.孩子有对象,基础有字符串.这是公平的,如果有两个object或两个有string.

我在Jon Skeet的深度超载部分C#中读到了这个