considerar los siguientes ::¿Por qué las enums de unboxing producen resultados extraños?
Object box = 5;
int @int = (int)box; // int = 5
int? nullableInt = box as int?; // nullableInt = 5;
StringComparison @enum = (StringComparison)box; // enum = OrdinalIgnoreCase
StringComparison? nullableEnum = box as StringComparison?; // nullableEnum = null.
2 cosas ::
- ¿Por qué puedo unbox a
StringComparison
? Supongo que esto se debe a que su tipo subyacente esInt32
, pero aún así me parece extraño. - ¿Por qué
nullableEnum
tiene un valor de nulo?
Como tengo entendido, el único unboxing válido es de un tipo de valor encuadrado en su tipo o en un tipo anulable. Si int
puede desempaquetar a Enum
, entonces ¿por qué no ocurre lo mismo con los valores que aceptan nulos? Del mismo modo, si en vez de 5 encasillé StringComparison.OrdinalIgnoreCase
, sería nullableInt
nulo, pero nullableEnum
no lo sería.
Re: error en el tiempo de ejecución: no diría que es un * error * en el tiempo de ejecución; más bien, el tiempo de ejecución es en algunos casos más indulgente de lo que requiere la especificación C#. Solo a un costo excesivo podemos restringir el comportamiento de la implementación de C# para que sea una implementación estricta de la especificación, sin ganancia real. –
Re: tipos "compatibles": sí, esto es un poco de agitar la mano en la especificación. Las reglas CLR son ligeramente inconsistentes. Es interesante, por ejemplo, que aunque int y uint se consideran tipos compatibles en el CLR a los efectos de la covarianza de matriz, no se consideran tipos compatibles en el CLR a los efectos de unboxing, aunque int y enum sí lo son. –
Punto justo, "error" es un poco duro. Estaba leyendo el primer bit citado como "unboxing to int? Debería funcionar cuando unboxing to int works", cuando es realmente "unboxing to int? Debería funcionar cuando unboxing to int * should * work". En realidad, mi punto era que la especificación concuerda con la intuición de Michael y que los diferentes resultados son un "accidente" de la indulgencia del tiempo de ejecución en lugar de una decisión de diseño deliberada de que el unboxing a las enumeraciones anulables no debería ser válido. – stevemegson