No es algo que ocurra muy frecuentemente, pero en determinadas ocasiones puede ser útil inicializar una propiedad de un tipo anónimo con el valor nulo, por ejemplo:
var conductor = new { Nombre = ”Marisa”, Edad = 34, Auto = “Renault Megane” };
var peaton = new { Nombre = “Juan”, Edad = 43, Auto = null };
En el código anterior se entiende que lo que queremos indicar estableciendo la propiedad Auto
a null
es que la persona que estamos representando no dispone de automóvil, o bien no conocemos este dato.
Algo muy normal… sino fuera porque el compilador se empeña en abofetearnos con el siguiente error:
Cannot assign <null> to anonymous type property
Y la verdad, en cuanto lo pensamos un poco, tiene sentido. En los casos anteriores, se está instanciando un tipo anónimo cuyas propiedades son generadas en tiempo de compilación. En el caso anterior, el compilador crearía para el tipo anónimo una propiedad “Nombre” de tipo string
, una “Edad” de tipo integer
, y una “Auto”, de tipo… ¿qué tipo podría asignar el compilador a esta propiedad? Ese es precisamente el problema.
Lo mismo ocurre al intentar inicializar variables implícitamente tipadas con el valor nulo; aunque cambia el error, el concepto idéntico, el compilador no es capaz de inferir el tipo de la variable:
var persona = null; // Error: Cannot assign <null> to an implicitly-typed local variable
La forma de solucionarlo en ambos casos es muy sencilla: basta con informar explícitamente al compilador del tipo de la propiedad, para que pueda crearla sin problema, por ejemplo así:
var peaton = new { Nombre = "Juan", Edad = 43, Auto = (string)null };
var persona = null as Persona;
Publicado en: Variable not found
4 Comentarios:
Y esto se puede hacer con VB.Net?
De momento las propiedades de mis objetos son si se puede "Nullable (Of ...)"
Saludos
Hola, Sergi, gracias por comentar.
En VB.NET podrías hacerlo utilizando utilizando CType o DirectCast:
Dim nombreNulo = New With _
{ .Nombre = CType(Nothing, String) }
Dim cadena = DirectCast(Nothing, String)
Un saludo
Me gusta mas utilizar default:
var peaton = new { Nombre = "Juan", Edad = 43, Auto = default(string) };
var persona = default(Persona);
Me parece mas corto .
Hola!
Pues sí, en versiones modernas de C# sería más cómodo usar default() :)
Muchas gracias por aportar!
Enviar un nuevo comentario