2010-10-14 1 views

risposta

6

Il processo è esattamente la stessa risoluzione di sovraccarico:

Func(myObject); 

Le compilatore controlla tutte le funzioni denominate "Func" e cerca di far corrispondere il tipo statico myObject ai parametri predefiniti (eventualmente utilizzando conversioni, upcasting a base classe). Se ha successo, chiama la funzione appropriata.

Se ti rendi conto che è possibile chiamare i metodi estensioni "in modo normale", poi schiarisce:

static class MyExtensions 
{ 
    public static void MyFunc(this string arg) 
    { 
     // ... 
    } 
} 

string a = "aa"; 
MyExtensions.MyFunc(a); // OK 
a.MyFunc();    // same as above, but nicer 

Per il tipo di dato (qui di stringa), il compilatore sembra proprio per tutte le funzioni statiche con "questo" modificatore sul primo argomento e cerca di far corrispondere il tipo statico a sinistra del. (in questo esempio "a") con il tipo di parametro nella funzione.

3

I metodi di istanza di una classe hanno un argomento nascosto. Un esempio:

class Example { 
    public void Foo(int arg) {} 
} 

si presenta come questo, quando il compilatore JIT è fatto con esso, riconvertito in C# sintassi:

static void Foo(Example this, int arg) {} 

Tale argomento nascosto è la ragione per cui è possibile utilizzare questo in un metodo di istanza. Il compilatore JIT calcola l'argomento per passare dal riferimento oggetto fornito per chiamare il metodo Foo.

Come si può vedere, è ora un short hop a un metodo di estensione.

0

Il compilatore prima cerca nella classe base una funzione corrispondente alla firma della funzione. Se non riesce a trovarlo, cerca un'estensione. Se un'estensione ha la stessa firma di un metodo della classe base, viene chiamato invece il metodo della classe base.

Questo potrebbe aiutare: Extension Methods