Esta entrada de blog podría ser útil para usted: http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx
En particular: "Si usted tiene una llamada al método con un argumento dinámico, que se distribuye de forma dinámica, y punto."
Eso significa que C# no sabe a qué sobrecarga se llama hasta el tiempo de ejecución. No sabe en tiempo de compilación. Según tengo entendido, ni siquiera comprueba cuáles son las sobrecargas posibles en tiempo de compilación (¿por qué lo haría?), O toma nota de que en su caso todas devuelven cadenas.
Por lo que en tiempo de compilación, se desconoce el valor de retorno de Foo
. Por lo tanto, el tipo de x
se determina en el momento de la compilación como dynamic
.
¿Qué pasa si solo tiene una sola función 'Foo' que devuelve un' Hashtable' disponible? El compilador no sabe de antemano lo que volverá como un valor de retorno. Podría haber generado la implementación para 'Foo' sobre la marcha (en tiempo de ejecución) después de todo. –
@Hamish Grubijan, cuando llama a la función 'Foo', el compilador sabe qué función se está llamando en tiempo de compilación. Intenta hacer que esta función esté estática, presiona F12 y navegará directamente a la función adecuada. –
@Darin, ¿por qué hacerlo estático hace la diferencia? –