c# dynamic c#-4.0

c# - Método de extensión y objeto dinámico



dynamic c#-4.0 (3)

Para ampliar la respuesta de Stecya ... los métodos de extensión no son compatibles con el tipado dinámico en forma de métodos de extensión , es decir, llamados como si fueran métodos de instancia. Sin embargo, esto funcionará:

dynamic dList = list; Console.WriteLine(Enumerable.First(dList));

Por supuesto, eso puede o no ser útil. Si pudiera proporcionar más información sobre por qué y cómo está tratando de usar el tipado dinámico, es posible que podamos ayudarlo más.

Voy a resumir mi problema en el siguiente fragmento de código.

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 }; Console.WriteLine(list.First());

El código anterior está funcionando bien.

Ahora probé lo siguiente

dynamic dList = list; Console.WriteLine(dList.First());

pero obtengo RuntimeBinderException. ¿Por qué es así?


Para expandir la respuesta de Jon, la razón por la que esto no funciona es porque en los métodos de extensión de código regulares y no dinámicos funciona haciendo una búsqueda completa de todas las clases conocidas por el compilador para una clase estática que tiene un método de extensión que coincide. La búsqueda va en orden en función del anidamiento del espacio de nombres y disponible using directivas en cada espacio de nombres.

Esto significa que para que la invocación de un método de extensión dinámico se resuelva correctamente, de alguna manera, el DLR debe saber en tiempo de ejecución qué anidamientos de espacio de nombres y directivas using en su código fuente . No tenemos un mecanismo útil para codificar toda esa información en el sitio de llamadas. Consideramos la posibilidad de inventar dicho mecanismo, pero decidimos que era un costo demasiado alto y producía demasiados riesgos de calendario para que lo mereciera.


Porque First() no es un método de List . Se define en la extensión de Linq a IEnumerable<>