Fundindo ints para enums em c #

Há algo que não consigo entender em c #. Você pode lançar um fora de alcanceint em umenum e o compilador não recua. Imagina istoenum:

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

Agora, se você escrever:

Colour eco;
eco = (Colour)17;

O compilador acha que está tudo bem. E o tempo de execução também. Uh

Por que a equipe da C # decidiu tornar isso possível? Essa decisão deixa de lado o uso de enums, em cenários como este:

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

Em uma linguagem de tipo forte como C #, eu gostaria de supor queeco terá sempre um legalColour valor. Mas este não é o caso. Um programador poderia chamar meu método com um valor de 17 atribuído aeco (como no trecho de código anterior), então o código no meu método não deve assumir queeco detém uma legalColour valor. Eu preciso testar explicitamente e lidar com os valores excepcionais como eu quiser. Por que é isso?

Na minha humilde opinião, seria muito melhor se o compilador emitisse uma mensagem de erro (ou até mesmo um aviso) ao transmitir um fora de alcanceint em umenum, se oint valor é conhecido em tempo de compilação. Caso contrário, o tempo de execução deve lançar uma exceção na instrução de atribuição.

O que você acha? Existe alguma razão pela qual isso é assim?

(Nota. Esta é uma perguntaEu postei há muito tempo no meu blog mas não obtivemos resposta informativa.)

questionAnswers(12)

yourAnswerToTheQuestion