27 votes

Comment sont ambigus les valeurs de l'enum résolu en C#?

Un "rapide" de chalutage par le biais de la spécification du langage C# a donné aucune réponse pour m'expliquer la sortie de le code suivant:

enum en {
    a = 1, b = 1, c = 1,
    d = 2, e = 2, f = 2,
    g = 3, h = 3, i = 3,
    j = 4, k = 4, l = 4
}

en[] list = new en[] {
    en.a, en.b, en.c,
    en.d, en.e, en.f,
    en.g, en.h, en.i,
    en.j, en.k, en.l
};
foreach (en ele in list) {
    Console.WriteLine("{1}: {0}", (int)ele, ele);
}

C'sorties:

c: 1
c: 1
c: 1
d: 2
d: 2
d: 2
g: 3
g: 3
g: 3
k: 4
k: 4
k: 4

Maintenant, pourquoi serait-il choisir le troisième "1", le premier "2" et "3", mais le second, "4"? Est-ce un comportement indéfini, ou ai-je raté quelque chose d'évident?

30voto

Lasse V. Karlsen Points 148037

C'est précisément documentée pour être sans-papiers comportement.

Il y a probablement quelque chose dans la façon dont le code est écrit qu'il sera à la fin de la cueillette chaque fois la même chose, mais la documentation de l'Enum.ToString etats ceci:

Si plusieurs membres de l'énumération ont la même valeur sous-jacente et que vous tentez de récupérer la chaîne de la représentation d'une énumération du nom du membre, fondé sur sa valeur sous-jacente, votre code ne doit pas faire d'hypothèses sur le nom de la méthode sera de retour.

(mon emphase)

Comme mentionné dans un commentaire, un autre .NET runtime peut retourner des valeurs différentes, mais tout le problème avec les sans-papiers comportement est qu'elle est sujette à changement de pas (apparemment) une bonne raison. Il pourrait changer en fonction de la météo, le temps, l'humeur de la programmeur, ou même dans un correctif à l' .NET runtime. Vous ne pouvez pas compter sur les sans-papiers comportement.

Notez que dans votre exemple, ToString est exactement ce que vous voulez regarder, puisque vous êtes l'impression de la valeur, ce qui permettra à son tour de le convertir en une chaîne de caractères.

Si vous essayez de faire une comparaison, toutes les valeurs enum avec le même sous-jacent valeur numérique est l'équivalent, et vous ne pouvez pas dire lequel vous avez stocké dans une variable dans la première place.

En d'autres termes, si vous faites cela:

var x = en.a;

il n'existe aucun moyen pour ensuite en déduire que vous avez écrit en.a et pas en.b ou en.c comme ils le comparer tous égaux, ils ont tous la même valeur sous-jacente. Eh bien, bref de créer un programme qui lit sa propre source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X