2014-02-12 42 views
15

爲什麼啓動程序後會顯示C::Foo(object o)爲什麼重載不起作用?

using System; 

namespace Program 
{ 
    class A 
    { 
     static void Main(string[] args) 
     { 
      var a = new C(); 
      int x = 123; 
      a.Foo(x); 
     } 
    } 

    class B 
    { 
     public virtual void Foo(int x) 
     { 
      Console.WriteLine("B::Foo"); 
     } 
    } 

    class C : B 
    { 
     public override void Foo(int x) 
     { 
      Console.WriteLine("C::Foo(int x)"); 
     } 

     public void Foo(object o) 
     { 
      Console.WriteLine("C::Foo(object o)"); 
     } 
    } 
} 

我不明白爲什麼當你調用C :: Foo,選擇方法與object,不與int。什麼是B類,該方法被標記爲重寫?

在類C中,有兩個名稱相同但參數不同的方法,是不是過載?爲什麼不?在父母中重寫的方法之一是否重要?它以某種方式禁用超載?

+0

簡單的答案。不要這樣做。不要在對象中包含重載。使用泛型,甚至動態不是對象 – Mick

回答

9

看一看Member lookup

首先,集合所有可訪問(第3.5節)名爲N 在T中聲明成員和T的基類型(第7.3.1節)的構造。 包含覆蓋修飾符的聲明不包含在集合中。如果沒有名爲N的成員存在並且可以訪問,則查找 不會產生匹配,並且不評估以下步驟。

所以根據這一點,將使用

public void Foo(object o) 

第一

相關問題