2015-07-29 5 views
5

Wenn ich eine Erweiterungs-Methode auf Enum mit dem Namen HasFlag erstelle, versuche ich immer, HasFlag für eine enum-Instanz aufzurufen, die Erweiterungsmethode und nicht die Instanzmethode. Warum?Warum hat die HasFlag-Erweiterungs-Methode auf Enum Enum.HasFlag?

public static class Extensions 
{ 
    public static bool HasFlag(this Enum e) 
    { 
    return false 
    } 
} 

Mit Code:

public enum Foo 
{ 
    A, B, C 
} 

public void Whatever() 
{ 
    Foo e = Foo.A; 
    if (e.HasFlag()) 
    { 
    // ... 
    } 
} 

Compiliert zu:

public void Whatever() 
{ 
    Foo e = Foo.A; 
    if (Extensions.HasFlag(e)) 
    { 
    // ... 
    } 
} 

Warum der Compiler nicht die Enum.HasFlag Instanz-Methode verwenden?

+3

Da die Instanz-Methode 'HasFlag' erwartet einen Parameter. Da Sie keine angeben, wird die Erweiterungsmethode aufgelöst. Versuchen Sie 'e.HasFlag (Foo.A);' und sehen Sie. – haim770

+0

Überprüfen Sie in der Tat die [docs] (https://msdn.microsoft.com/en-us/library/dd782536 (v = vs.110) .aspx) und notieren Sie die Signatur. Es unterscheidet sich von Ihrer 'HasFlag' Funktion. Es ist auch nicht sinnvoll, 'HasFlag' zu verwenden, es sei denn, Ihre Enum ist mit dem' FlagsAttribute' gekennzeichnet. –

+0

Huch! Ich schalte den Computer aus und lasse mich schön hinlegen. Vielen Dank! – citizenmatt

Antwort

1

Erweiterungsmethoden ermöglichen das Hinzufügen von Methoden zu vorhandenen Typen, ohne dass ein neuer abgeleiteter Typ erstellt, neu kompiliert oder der ursprüngliche Typ anderweitig geändert wird. Erweiterungsmethoden sind eine spezielle Art von statischen Methoden, die jedoch so aufgerufen werden, als wären sie Instanzmethoden für den erweiterten Typ. Für Client-Code, der in C# und Visual Basic geschrieben wird, gibt es keinen offensichtlichen Unterschied zwischen dem Aufrufen einer Erweiterungsmethode und den Methoden, die in einem Typen tatsächlich definiert werden.

Erweiterungsmethoden können nicht überschreiben auf Instanz Hauptverfahren sein, und es wird nicht wissen, welche Methode zu nennen:

zwischen den folgenden Methoden

Der einzige Weg, um dieses

Der Aufruf ist nicht eindeutig ist Rufen Sie Ihre Erweiterungsmethode mit der normalen statischen Methodensyntax auf. Anstatt also diese:

e.HasFlag(); 

Sie müssten dies tun:

Extensions.HasFlag(e); 

Aber wenn Sie andere Parameter Ihre Erweiterungsmethoden hinzufügen, dann ist es nicht gleich Haupt-Methoden, also wenn Sie HasFlag nennen Methode, die Erweiterungsmethode tatsächlich aufgerufen. Zum Beispiel:

public static bool HasFlag(this Enum e, bool isNullable) 
{ 
    return false; 
} 

Referenzen:

Extension Methods (C# Programming Guide)

Extension Methods, Nulls, Namespaces and Precedence in C#

+1

Ja, ich war dumm, und verpasste die Parameter. Vielen Dank! – citizenmatt