Valeurs multiples dans les déclarations d'énumération : une plongée plus approfondie dans le CLR
Contrairement aux structures, les énumérations sont classées comme des types de valeurs légers qui représentent un ensemble de constantes nommées. Cependant, la question présente une observation intrigante selon laquelle les énumérations peuvent apparemment permettre d'attribuer plusieurs valeurs à la même constante.
En fouillant dans les détails d'implémentation du Common Language Runtime (CLR), il devient clair que les énumérations sont fondamentalement similaires aux structures. En arrière-plan, les énumérations dérivent de la classe de base System.Enum et sont essentiellement des structures avec des valeurs constantes prédéfinies.
Considérez l'exemple de déclaration d'énumération :
public enum Color { Red = 1, Blue = 1, Green = 1 }
CLR interprète en interne cette déclaration comme suit :
public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; }
Bien que C# interdise la déclaration explicite de classe de base pour les structures, le CLR génère néanmoins cette représentation pour les énumérations.
La présence de plusieurs constantes de même valeur dans un type enum ne pose pas de problème. Cependant, cette attribution de valeur non unique peut entraîner un comportement inattendu lors de la conversion vers le type enum.
Par exemple :
Color color1 = (Color)1; Color color2 = (Color)Enum.Parse(typeof(Color), "1");
color1 et color2 seront définis sur la valeur Rouge car la première attribution de valeur est arbitraire. Techniquement, ni color1 ni color2 ne se voient attribuer du rouge ; ils contiennent plutôt la valeur 1. Mais lorsqu'ils sont affichés, c'est le rouge que vous verrez.
De plus, les opérations de comparaison entre des valeurs d'énumération non uniques peuvent donner des résultats surprenants :
// true (Red is Green??) bool b = Color.Red == Color.Green;
Cette égalité est vraie car la valeur numérique sous-jacente du rouge et du vert est 1.
Bien que ce comportement ne soit pas problématique en soi, il mérite d'être pris en considération lors de l'utilisation d'énumérations. avec des valeurs non uniques. Il est essentiel de déterminer si ce caractère non-unique correspond à l'objectif visé et à la sémantique de la conception de votre énumération.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!