Pergunta

O código a seguir não produz uma exceção, mas passa o valor 4 para tst.Alguém pode explicar a razão por trás disso?

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
Foi útil?

Solução

Em C#, diferentemente do Java, as enumes não são verificadas. Você pode ter qualquer valor do tipo subjacente. É por isso que é muito importante verificar sua entrada.

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

Outras dicas

Como o seu enum é baseado no INT, ele pode aceitar qualquer valor que o int possa. E como você está dizendo ao compilador explicitamente (lançando) que não há problema em lançar 4 na sua enumeração, isso o faz.

Cada enumeração possui um tipo numérico subjacente (por exemplo, int) usado para representação. Mesmo que um valor não tenha um nome, é um valor possível que a enum pode ter.

O que outros não disseram:Com a conversão, você diz ao compilador que sabe o que está fazendo.Então, se você contar, trate isso como um valor enum, é verdade.Os outros postadores apontaram por que isso ainda é permitido, já que o compilador C# não permite muitas coisas ruins, mesmo que você diga que sabe o que está fazendo.

Seria muito ruim se o valor não fosse permitido, porque então você não poderia salvar um valor de sinalizador como um int.Ou alguém teve que verificar se int é uma das combinações permitidas, o que pode ser muito se você usar um flag enum (com valores que podem ser combinados em or).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top