2010-10-14 21 views

Respuesta

6

El proceso es exactamente la misma que la resolución de sobrecarga:

Func(myObject); 

El compilador comprueba todas las funciones con nombre "Func" y trata de hacer coincidir el tipo estático de myObject a los parametros (posiblemente utilizando las conversiones, upcasting a la base clase). Si tiene éxito, llama a la función apropiada.

Si se da cuenta de que se puede llamar a los métodos extensiones "de una manera normal", entonces se aclara:

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

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

Para el tipo determinado (en este caso cadena), el compilador sólo se ve para todas las funciones estáticas con "this" modificador en el primer argumento e intenta hacer coincidir el tipo estático a la izquierda del. (en este ejemplo "a") con el tipo de parámetro en la función.

3

Los métodos de instancia de una clase tienen un argumento oculto. Un ejemplo:

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

en realidad se parece a esto cuando el compilador JIT se hace con ella, convierte de nuevo en sintaxis de C#:

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

Ese argumento oculta es la razón por la que se puede utilizar este en un método de instancia. El compilador JIT determina el argumento que debe pasar desde la referencia del objeto que usted proporciona para llamar al método Foo.

Como puede ver, ahora es muy salto corto a un método de extensión.

0

El compilador busca primero en la clase base una función que coincida con la firma de la función. Si no puede encontrarlo, busca una extensión. Si una extensión tiene la misma firma que un método de clase base, en lugar de eso se llama al método de clase base.

Esto podría ayudar: Extension Methods

Cuestiones relacionadas