2010-10-22 19 views
10
public string Foo(object obj) { 
    return null; 
} 

public string Foo(string str) { 
    return null; 
} 

var x = Foo((dynamic) "abc"); 

¿Por qué x dinámico, el compilador no es lo suficientemente inteligente o echo de menos algo importante?¿Por qué el resultado dinámico de devolución de llamada dinámica?

+0

¿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. –

+0

@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. –

+0

@Darin, ¿por qué hacerlo estático hace la diferencia? –

Respuesta

4

Sólo estoy adivinando, pero ...

Cuando se agrega un yeso para dynamic, toda la expresión se convierte en una expresión dinámica. El resultado de una expresión dinámica siempre será dynamic porque todo se resuelve en tiempo de ejecución.

visita nuestra página de MSDN sobre el uso de dynamic para más información:

Using Type dynamic (C# Programming Guide)

y vaya al siguiente texto:

El resultado de las operaciones más dinámicas es en sí misma dinámica.

+0

Sí, pero esto compila muy bien: 'cadena x = Foo ((dinámico)" abc ");' –

+0

¿Por qué es necesario resolverlo en tiempo de ejecución, si todos los métodos devuelven cadena? – dotneter

+0

@Darin - Mira el enlace que publiqué. También cubre las conversiones implícitas de dinámicos a tipos estáticos. Busque: "Por el contrario, una conversión implícita se puede aplicar dinámicamente a cualquier expresión de tipo dinámico". En este caso, el resultado de la expresión sigue siendo dinámico, pero como usted declara x como un tipo estático, se vuelve a convertir implícitamente. –

3

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.

Cuestiones relacionadas