2015-07-29 24 views
5

Se creo un metodo di estensione su Enum chiamato HasFlag, ogni volta che provo a chiamare HasFlag in un'istanza di enum, utilizza il metodo di estensione, anziché il metodo di istanza. Perché?Perché il metodo di estensione HasFlag su Enum ha la meglio su Enum.HasFlag?

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

con il codice:

public enum Foo 
{ 
    A, B, C 
} 

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

compila a:

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

Perché non il compilatore utilizzare il metodo Enum.HasFlag esempio?

+3

Poiché il metodo di istanza 'HasFlag' si aspetta un parametro. Dal momento che non ne fornite uno, viene risolto il metodo di estensione. Prova 'e.HasFlag (Foo.A);' e guarda. – haim770

+0

Effettivamente, controlla i [documenti] (https://msdn.microsoft.com/en-us/library/dd782536 (v = vs.110) .aspx) e nota la firma. È diverso dalla funzione 'HasFlag'. Inoltre, non ha senso usare 'HasFlag' a meno che il tuo enum non sia contrassegnato con' FlagsAttribute'. –

+0

Yikes! Sto spegnendo il computer e sto andando a fare una bella sdraiata. Grazie! – citizenmatt

risposta

1

I metodi di estensione consentono di "aggiungere" metodi a tipi esistenti senza creare un nuovo tipo derivato, ricompilare o modificare in altro modo il tipo originale. I metodi di estensione sono un tipo speciale di metodo statico, ma sono chiamati come se fossero metodi di istanza sul tipo esteso. Per il codice client scritto in C# e Visual Basic, non vi è alcuna differenza apparente tra la chiamata di un metodo di estensione e i metodi effettivamente definiti in un tipo.

metodi di estensione non possono essere override di metodi principali istanza e non sapranno quale metodo chiamare:

La chiamata è ambigua tra i seguenti metodi

L'unico modo per aggirare questo è di chiama il tuo metodo di estensione usando la normale sintassi del metodo statico. Così, invece di questo:

e.HasFlag(); 

si dovrebbe fare questo:

Extensions.HasFlag(e); 

Ma se si aggiungono altri parametri per i tuoi metodi di estensione allora non è lo stesso per i metodi principali, in modo da quando si chiama HasFlag metodo, il metodo di estensione chiamato in realtà. Per esempio:

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

Riferimenti:

Extension Methods (C# Programming Guide)

Extension Methods, Nulls, Namespaces and Precedence in C#

+1

Sì, ero stupido e ho perso i parametri. Grazie! – citizenmatt