2014-02-12 12 views
15

Warum wird nach dem Start des Programms angezeigt C::Foo(object o)?Warum Überladung nicht funktioniert?

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)"); 
     } 
    } 
} 

Ich kann nicht verstehen, warum, wenn Sie C :: Foo nennen, Methode mit dem object auswählt, nicht mit int. Was ist die Klasse B und diese Methode ist als Überschreibung markiert?

In Klasse C gibt es zwei Methoden mit dem gleichen Namen, aber unterschiedlichen Parametern, ist es nicht überladen? Warum nicht? Ist es wichtig, dass eine der Methoden im übergeordneten Objekt außer Kraft gesetzt wird? Es deaktiviert irgendwie Überlastung?

+0

Einfache Antwort. Tu das nicht. Verwenden Sie keine Überladung mit Objekten. Verwenden Sie Generika oder gar kein dynamisches Objekt – Mick

Antwort

9

Werfen Sie einen Blick auf Member lookup

Zunächst wird die Menge aller zugänglich (Abschnitt 3.5) Mitglieder N genannt in T und den Basistypen (Abschnitt 7.3.1) von T deklariert wird aufgebaut. Deklarationen, die einen Überschreibungsmodifikator enthalten, werden aus dem Satz ausgeschlossen. Wenn keine Mitglieder mit dem Namen N existieren und zugänglich sind, erzeugt die Suche keine Übereinstimmung, und die folgenden Schritte werden nicht ausgewertet.

So diese nach, wäre es

public void Foo(object o) 

ersten

Verwandte Themen