¿Puede alguien explicarme por qué a continuación la tercera invocación de DoSomething no es válida? (Mensaje de error es "El nombre 'HacerAlgo' no existe en el contexto actual")¿Por qué no puede invocar los métodos de extensión directamente?
public class A { }
public class B : A
{
public void WhyNotDirect()
{
var a = new A();
a.DoSomething(); // OK
this.DoSomething(); // OK
DoSomething(); // ?? Why Not
}
}
public static class A_Ext
{
public static void DoSomething(this A a)
{
Console.WriteLine("OK");
}
}
Esto me da la mejor idea hasta ahora, creo. Entonces, básicamente, porque podría estar invocando un método que podría tener el mismo nombre y firma en una clase base y en la clase de extensión, ¿podría no saber cuál elegir en ese caso? Eso tendria sentido para mi. ¿Es eso correcto? –
@My Other Me: mientras lo leía, no era tanto un problema de ambigüedad como un problema de firma. En el código IL, el método de extensión todavía se considera estático. Sin embargo, el compilador crea un código de traducción que es específico del contexto con respecto a una instancia. Parece que usar 'this' crea ese contexto y sin un especificador de instancia, el compilador es libre de adivinar la" mejor coincidencia ", que sería la clase base sin la extensión. –
En última instancia, esto es simplemente una elección del compilador: la consideración de un 'this' implícito cuando se resuelven métodos depende enteramente del compilador. Nada que ver con IL. El compilador podría elegir implementar 'this.SomeExtensionMethod()' y 'SomeExtensionMethod()' de forma idéntica, haciendo una llamada estática a 'SomeExtensionMethod (this)' –