Question

Le code suivant ne génère pas d'exception, mais passe la valeur 4 à tst. Quelqu'un peut-il expliquer la raison derrière cela?

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

testing tst = (testing)(4);
Était-ce utile?

La solution

En C #, contrairement à Java, les énumérations ne sont pas vérifiées. Vous pouvez avoir n'importe quelle valeur du type sous-jacent. C’est pourquoi il est très important de vérifier votre saisie.

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

Autres conseils

Puisque votre enum est basé sur int, il peut accepter toutes les valeurs qu’il peut. Et puisque vous dites explicitement au compilateur (en définissant) qu'il est correct de transtyper 4 dans votre enum, il le fait.

Chaque énumération a un type numérique sous-jacent (par exemple, int) utilisé pour la représentation. Même si une valeur n'a pas de nom, c'est une valeur possible que l'énum peut avoir.

Ce que d’autres n’ont pas dit: Avec le casting, vous dites au compilateur que vous savez ce que vous faites. Donc, si vous le dites, traitez cela comme une valeur enum, c'est le cas. Les autres affiches ont expliqué pourquoi cela est toujours permis, car le compilateur C # ne permet pas beaucoup de mauvaises choses, même si vous dites que vous savez ce que vous faites.

Ce serait vraiment dommage si la valeur n'était pas autorisée, car vous ne pourriez alors pas enregistrer une valeur de drapeau sous la forme d'un entier. Ou encore, il fallait que quelqu'un vérifie si int est l'une des combinaisons autorisées, ce qui peut être beaucoup si vous utilisez un drapeau enum (avec des valeurs pouvant être marquées ensemble).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top