Casting ints a enums en C #

Hay algo que no puedo entender en C #. Puedes lanzar un fuera de rangoint en unaenum y el compilador no se inmuta. Imagina estoenum:

enum Colour
{
    Red = 1,
    Green = 2,
    Blue = 3
}

Ahora, si escribes:

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ó hacer esto posible? Esta decisión pierde el punto de usar enumeraciones, creo, en escenarios como este:

void DoSomethingWithColour(Colour eco)
{
    //do something to eco.
}

En un lenguaje fuerte como C #, me gustaría asumir queeco siempre tendrá un legalColour valor. Pero este no es el caso. Un programador podría llamar a mi método con un valor de 17 asignado aeco (como en el fragmento de código anterior), por lo que el código en mi método no debe asumir queeco tiene un legalColour valor. Necesito probarlo explícitamente y manejar los valores excepcionales como me plazca. ¿Por qué es esto?

En mi humilde opinión, sería mucho mejor si el compilador emitiera un mensaje de error (o incluso una advertencia) al emitir un mensaje fuera de rangoint en unaenum, Si elint El valor se conoce en tiempo de compilación. Si no, el tiempo de ejecución debe lanzar una excepción a la declaración de asignación.

¿Qué piensas? ¿Hay alguna razón por la que esto es así?

(Nota. Esta es una preguntaLo publiqué hace años en mi blog. pero no obtuvo respuesta informativa.)

Respuestas a la pregunta(12)

Su respuesta a la pregunta