español c# c#-4.0 dynamic static

español - ¿Por qué el compilador de c#no verifica la "estática" del método en los sitios de llamadas con un argumento dinámico?



static dynamic c# (2)

¿Por qué el compilador de C # no me dice que este fragmento de código no es válido?

class Program { static void Main(string[] args) { dynamic d = 1; MyMethod(d); } public void MyMethod(int i) { Console.WriteLine("int"); } }

La llamada a MyMethod falla en tiempo de ejecución porque estoy intentando llamar a un método no estático desde un método estático. Eso es muy razonable, pero ¿por qué el compilador no considera esto un error en tiempo de compilación?

Lo siguiente no compilará

class Program { static void Main(string[] args) { dynamic d = 1; MyMethod(d); } }

entonces, a pesar del despacho dinámico, el compilador verifica que MyMethod existe. ¿Por qué no verifica la "estática"?


Cuando el compilador encontró la operación en / con una variable de tipo dynamic , emitirá esa información utilizando el objeto CallSite . (El objeto CallSite almacena información sobre la llamada).

En su primera muestra, puede compilar porque el compilador puede emitir la información (por ejemplo, tipo de llamada, método que desea llamar, etc.). En el segundo código, intentas llamar al método que no existe para que el compilador no pueda emitir el código IL por ti.


La resolución de sobrecarga es dinámica aquí. Visible en este fragmento de código:

class Program { public static void Main() { dynamic d = 1.0; MyMethod(d); } public void MyMethod(int i) { Console.WriteLine("int"); } public static void MyMethod(double d) { Console.WriteLine("double"); } }

Funciona bien. Ahora asigne 1 a d y observe el error de tiempo de ejecución. El compilador no puede emular razonablemente la resolución de sobrecarga dinámica en tiempo de compilación, por lo que no lo intenta.