NET está haciendo una apuesta muy fuerte por los lenguajes dinámicos y sus características. Primero con toda la infraestructura del DLR (Dynamic Language Runtime), IronRuby, IronPython,… y ahora añadiendo mejoras en la interacción de estos nuevos lenguajes con C# a través de la palabra reservada dynamic.
dynamic es un nuevo tipo, pero es un tipo especial que se resuelve en tiempo de ejecución y no en tiempo de compilación, es decir, podemos hacer algo como:
dynamic a = GetDynamicObject();
a.SomeMethod();
Y realmente, podríamos ejecutar cualquier cosa sobre a, porque el Visual Studio no tiene ni idea de que es a hasta que se ejecute este código (vamos, que cuando le damos al punto no sale nada en el Intellisense ;) ). Esto seguramente le resultará raro a mucha gente, ya que por lo general los programadores de C# estamos acostumbrados al tipado estático (los tipos se saben en tiempo de compilación) pero si queremos poder interactuar con lenguajes dinámicos necesitamos que C# soporte el tipado dinámico.
Hay que tener en cuenta que dynamic no es lo mismo que object ni que var. Por ejemplo, esto compila con dynamic:
dynamic a = "hola";
a.SomeMethod();
int i = a;
Como a es dinámico, todas las operaciones en las que a esté involucrado se resolverán en tiempo de ejecución (a pesar de que claramente las dos van a petar). Si hacemos esto:
dynamic num = 3;
var result = num + 5;
Y usamos el visual para ver el tipo de result, nos saldrá que es dynamic, ya que como num es dynamic, a pesar de que tiene un entero dentro y le estamos sumando otro entero, toda la operación pasa a ser dinámica. Así mismo dynamic no solo puede usarse para declarar tipos aislados, sino también para parámetros en funciones. Esto es perfectamente legal:
public
void Method(dynamic argument)
{
argument.DoSomething();
}
En tiempo de compilación funcionará, y luego en tiempo de ejecución dependerá de si el objeto argument tiene un método llamado DoSomething sin parámetros. Si no es el caso recibiremos una RuntimeException al llegar a esa línea de código. Esto también es legal en tiempo de compilación:
Func<dynamic, bool> func = x => x.BoolenValue;
Donde habríamos declarado un delegado que recibe un tipo dinámico y devuelve un bool.
La verdad que para C# dynamic es un arma de doble filo: por un lado te permite hacer aberraciones ya que cualquier cosa dinámica compila y todos los errores te los vas a encontrar en tiempo de ejecución. Pero por otro lado te permite hacer cosas que son muy difíciles (o engorrosas) de expresar con C# 3.0 y que en ciertas situaciones son muy útiles. En los próximos posts explicaré más en detalle nuevas características de dynamic y el DLR y como nos pueden ayudar a hacer sistemas muy flexibles en C#.
Para más información: http://msdn.microsoft.com/en-us/library/dd264736%28VS.100%29.aspx