Anonymous types (o tipos anónimos, también llamados projections) es una nueva característica que incorporan las nuevas versiones de los lenguajes C# y VB.NET (3.0 y 9.0 respectivamente). 
Los tipos anónimos nos permiten declarar tipos al momento, sin tener que hacer una declaración explícita (es decir, sin tener que crear una clase).  Los tipos anónimos tienen una mayor utilidad en las expresiones LINQ, ya que estas sentencias muchas veces no se mapean a una entidad lógica concreta y requieren la creación de un nuevo tipo de objetos al momento (on the fly) para poder ser tratadas posteriormente.

Nada mejor que un poco de código para comprender mejor lo explicado.

VB.NET:

Existen diferencias sintácticas entre los dos lenguajes que tratamos en este blog asiduamente (VB.NET y C#) con respecto a los tipos anónimos.
Para declarar un tipo anónimo en VB.NET se hace uso de la palabra reservada With, tal y como se muestra en la siguiente imagen:

 

Declaración de un tipo anónimo en VB.NET. Observar como el compilador detecta las propiedades declaradas.

Figura 1: Declaración de un tipo anónimo en VB.NET. Observar como el compilador detecta las propiedades declaradas.

 

Tal y como puede observarse en la imagen, el compilador ya detecta las propiedades que tiene el nuevo tipo de objetos y que hemos especificado en la declaración (inline) de la propia variable. 
Cabe destacar el uso necesario de la palabra reservada With para especificar que se está declarando un tipo anónimo, así como el uso del punto para especificar el inicio de la declaración de un atributo del tipo en i.  

 

C#:

A continuación se muestra el mismo ejemplo pero utilizando C# como lenguaje de programación. A destacar las diferencias en la sintaxis. No es necesario hacer uso de la palabra reservada With y tampoco es necesario comenzar los nombres de los atributos con un  punto:

 

Aqui también puede apreciarse como el compilador detecta las propiedades del objeto que se ha declarado inline en la linea anterior

Figura 2: Aquí también puede apreciarse como el compilador detecta las propiedades del objeto que se ha declarado inline en la línea anterior

 

 

Nótese como se hace uso de la palabra reservada var, ya que en éste ejemplo también hay implícito el uso de la inferéncia de tipos.

En el caso de VB.NET, será necesario tener activada la opción Option Infer On con tal de que este ejemplo compile correctamente.

Pero, ¿cómo actúa el compilador para conseguir éste resultado? ¿Cada vez que declaro un tipo anónimo se crea un nuevo tipo interno?
Son buenas preguntas con respuestas simples:
– Cuando declaramos un tipo anónimo, el compilador actúa creando un tipo interno exactamente igual que si nosotros lo hubiéramos creado de forma explícita, es decir, creando una clase (directamente en código MSIL) con un nombre del tipo <proyección>f__0.

– Los tipos anónimos están tipados, por lo que, si nosotros declaramos otra variable del tipo anónimo utilizando la misma sintaxis que en los ejemplos, el compilador no crearía otro tipo de datos, sino que instanciaría un nuevo objeto haciendo uso del tipo antes declarado. En cambio, si cambiamos el orden en el que definimos los atributos (por ejemplo, primero indicamos los Apellidos y luego el Nombre, el compilador lo interpretará como un nuevo tipo de datos y creará, de forma interna, otro tipo de datos distinto.

Para finalizar, sólo cabe mencionar que los tipos anónimos son de contexto local, por lo que si pasamos como parámetro un tipo anónimo a otro assembly, éste no podrá determinar el tipo a menos que hagamos uso de la Reflexión (Reflection).

Y eso es todo por el momento. Espero que esta información os resulte interesante y os sea útil. Hasta pronto!