Maison > développement back-end > C++ > Les énumérations en C# peuvent-elles contenir plusieurs valeurs avec la même constante sous-jacente, et quelles sont les implications ?

Les énumérations en C# peuvent-elles contenir plusieurs valeurs avec la même constante sous-jacente, et quelles sont les implications ?

Susan Sarandon
Libérer: 2025-01-03 02:12:37
original
152 Les gens l'ont consulté

Can Enums in C# Hold Multiple Values with the Same Underlying Constant, and What are the Implications?

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
}
Copier après la connexion

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;
}
Copier après la connexion

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");
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal