2013-08-11 14 views
6

Abgeleitete Klasse enthält eine "Count" -Methode, die einige Aktionen für die Klasse "Derived" durchführt. Andererseits habe ich eine Erweiterungsmethode, die auch auf die Klasse "Derived" abzielt.Warum Extension-Methode verhält sich anders?

Derived derived = new Derived(); 
derived.Count(); 

Durch den Aufruf von oben Snippet wird "Count" -Methode innerhalb der abgeleiteten Klasse ausführen. Warum C# -Compiler nicht warnt und identifiziert die Erweiterungsmethode in dieser Situation. Wie funktioniert das Framework intern?

//Base class 
public class Base 
{ 
    public virtual string Count() 
    { 
     return string.Empty; 
    } 
} 

//Derived class 
public class Derived : Base 
{ 
    public override string Count() 
    { 
     return base.Count(); 
    } 
} 

//Extension Methods for Derived class 
public static class ExtensionMethods 
{ 
    public static Derived Count(this Derived value) 
    { 
     return new Derived(); 
    } 
} 

Antwort

6

Die Spezifikation (§7.6.5.2) sagt ausdrücklich, dass Instanzmethoden Vorrang vor Erweiterungsmethoden nehmen: keine anwendbaren Methoden

, wenn die normale Verarbeitung des Aufrufs findet, wird ein Versuch, Prozess gemacht das Konstrukt als Aufruf einer Erweiterungsmethode.

...

Die vorstehenden Regeln bedeuten, dass Instanzmethoden Vorrang vor den Erweiterungsmethoden nehmen, dass Erweiterungsmethoden in Innennamespace-Deklarationen haben Vorrang vor den Erweiterungsmethoden in äußeren Namespace-Deklarationen und dass Erweiterungsmethoden erklärten direkt in Ein Namespace hat Vorrang vor Erweiterungsmethoden, die mit einer using-namespace-Direktive in denselben Namespace importiert wurden. Beispiel:

Wenn eine Instanzmethode den übergebenen Parametern entspricht, werden Erweiterungsmethoden nicht berücksichtigt.

+0

Sie können auch Details darüber hinzufügen, warum. Beispiele, die ich mir vorstellen kann: Reduzieren von Mehrdeutigkeiten, und so ändern Sie nicht die Funktionalität der Kernklasse (dh, indem Sie die Erweiterung "Count" oder die Zählung der Instanz aufrufen, je nachdem, was im Bereich oder zu der Zeit angegeben ist) – Xcelled194

+0

If Sie möchten wirklich die Erweiterungsmethode anstelle der normalen Methode aufrufen, Sie können den syntaktischen Zucker nicht verwenden und müssen den normalen statischen Methodenaufruf verwenden: 'Derived derived = new Derived(); ExtensionMethods.Count (abgeleitet); ' – Alejandro

Verwandte Themen