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.)