Hay algo que no puedo entender en C#. Puede convertir int
fuera de rango en enum
y el compilador no parpadea. Imagínese esto enum
:Casting ints a enumeraciones en C#
enum Colour
{
Red = 1,
Green = 2,
Blue = 3
}
Ahora, si escribe:
Colour eco;
eco = (Colour)17;
El compilador piensa que está bien. Y el tiempo de ejecución, también. ¿Uh?
¿Por qué el equipo de C# decidió hacerlo posible? Esta decisión se pierde el punto de utilizar enumeraciones, creo que, en escenarios como éste:
void DoSomethingWithColour(Colour eco)
{
//do something to eco.
}
En un lenguaje de tipos fuertes como C#, me gustaría asumir que eco
siempre tendrá un valor legal Colour
. Pero este no es el caso. Un programador podría llamar a mi método con un valor de 17 asignado a eco
(como en el fragmento de código anterior), por lo que el código en mi método no debe suponer que eco
tiene un valor legal Colour
. Necesito probarlo explícitamente y manejar los valores excepcionales cuando me plazca. ¿Por qué es esto?
En mi humilde opinión, sería mucho mejor si el compilador emite un mensaje de error (o incluso una advertencia) al lanzar un fuera de rango int
en un enum
, si el valor int
se conoce en tiempo de compilación. De lo contrario, el tiempo de ejecución arrojaría una excepción en la declaración de asignación.
¿Qué opinas? ¿Hay alguna razón por la cual esto es así?
(. Nota Esta es una pregunta I posted ages ago on my blog pero no obtuvo respuesta informativa.)
Tu punto es? :-) Si desea que SouthEast sea una dirección válida, creo que debería incluirlo en la declaración enum como SouthEast = 10, por ejemplo. ¿De acuerdo? – CesarGon
Se llaman enumeraciones de banderas. Diseño muy vaild –
No, no estoy de acuerdo. Los campos de bits son un uso perfectamente válido de una enumeración, hasta el punto de que ni siquiera se requiere el atributo [Flags] para usarlos como tales. –