2010-09-18 5 views
0

J'ai créé simple ENUM en C# comme suitproblème en ce qui concerne l'attribution des numéros à un ENUM variables

enum Direction 
{ 
    North, 
    South, 
    East, 
    West 
} 

Maintenant, je crée une variable de ce ENUM Direction:

Direction D = (Direction)3; 
Console.WriteLine(D.ToString()); 

Chaque Tout va bien et le code fonctionne comme prévu et donne ce qui suit en sortie.

West 

mais maintenant si je change le code un peu comme:

Direction D = (Direction)8; 
Console.WriteLine(D.ToString()); 

il donne suite en sortie:

8 

Alors enfin les questions me sont venues à l'esprit sont:

  1. Pourquoi cela se fait-il lorsque le maximum acceptable v alue est 3.
  2. Si c'est accepté au moment de la compilation, alors pourquoi il ne lève aucune exception alors que le framework .net est encore un framework robuste.
  3. Et enfin, mais non le moindre, si tout ne va pas attendre pourquoi il donne la sortie 8.

Merci à copains d'avance :)

GURU

+0

Salut merci à dtb pour m'avoir donné une réponse si merveilleuse mais ici je voudrais ajouter un peu plus que j'ai trouvé quelque part sur msdn. Je peux utiliser le code suivant: Enum.IsDefined (typeof (Direction), 8) pour vérifier si 8 est une valeur valide de pas avant de l'assigner. :) – necixy

Répondre

1

Pourquoi est-ce se fait lorsque la valeur maximale acceptable est 3.

Cette hypothèse est incorrecte. Vous pouvez affecter n'importe quelle valeur comprise dans la plage du type de base de l'énumération (ici: int) à une variable de ce type enum. Si elle est acceptée au moment de la compilation, alors pourquoi il ne lève aucune exception alors que le framework .net est encore un framework robuste. Il ne lance pas d'exception, car ce n'est pas une situation exceptionnelle, mais parfaitement valide.

Et enfin, mais non le moindre, si tout ne va pas attendre pourquoi il donne la sortie 8.

Parce qu'il n'y a aucun membre enum qui donne un nom à la valeur 8.


Si vous ne voulez pas une valeur ENUM autre que ceux qui ont un nom à passer à une méthode, vous devriez vérifier les entrées de la méthode:

void Move(Direction d) 
{ 
    if (d != Direction.North && d != Direction.South && 
     d != Direction.East && d != Direction.West) 
    { 
     throw new ArgumentOutOfRangeException("d"); 
    } 

    // ... 
} 
+0

U sais quoi ??? C'est ce qu'on appelle une explication. Gardez bascule Buddy !! :) – necixy

+0

... ou même lancer une nouvelle InvalidEnumArgumentException ("d", (int) d, typeof (Direction)); – Joe

1

énumérations sont simplement des constantes nommées et C# n'offre aucun contrôle de portée si vous lancez une valeur dans une énumération.

1) Il n'y a pas de contrôle de portée. Regardez les enums comme un (petit) ensemble de noms pour un ensemble de chiffres (généralement) beaucoup plus grand. C'est à dire. C# vous permet d'attribuer des noms à des valeurs spécifiques, mais il ne limite pas les valeurs autorisées, ainsi une variable enum peut prendre n'importe quelle valeur du type sous-jacent (par défaut est int) si vous la lancez.

2) Identique à 1) vraiment

3) Que voulez-vous attendre. Vous n'avez pas attribué de nom à cette valeur. Vous pouvez également vérifier this question.

0

Normalement, lorsque vous déclarez un ENUM comme vous définissez les valeurs en fonction de la liste:

enum Direction{ 
North, 
South, 
East, 
West} 

Direction D = Direction.East; 

Quelle est votre raisonnement derrière essayer de définir une valeur de 8?

+0

Vous pouvez * le définir sur une valeur de 8. OP demande * pourquoi *. – dtb