"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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?

Publié le 2025-03-24
Parcourir:328

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 profonde dans le CLR

Contrairement aux structures, les énumations sont classées comme des types de valeur légers qui représentent un ensemble de constantes nommées. Cependant, ce que la question présente, c'est une observation intrigante que les énumérations peuvent apparemment permettre à plusieurs valeurs d'être attribuées à la même constante.

se plonger dans les détails de mise en œuvre de l'exécution du langage commun (CLR), il devient clair que les énumérations sont fondamentalement similaires aux structures. Dans les coulisses, 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 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 # interdit la déclaration de classe de base explicite pour les structures, le CLR génère néanmoins cette représentation pour les énumérations.

La présence de plusieurs constantes avec la même valeur dans un type d'énumération ne pose pas de problème. Cependant, cette affectation de valeur non unique peut entraîner un comportement inattendu lors de la conversion en type d'énumération.

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 affectation de valeur est arbitraire. Techniquement, ni Color1 ni Color2 ne se sont attribués en rouge; ils tiennent plutôt la valeur 1. Mais lorsqu'il est affiché, le rouge est ce que vous verrez.

De plus, les opérations de comparaison entre les 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 parce que la valeur numérique sous-jacente pour le rouge et le vert est 1.

Bien que ce comportement ne soit pas intrinsèquement problématique, il mérite une considération lors de l'utilisation d'énumérations avec des valeurs non uniques. Il est essentiel de déterminer si cette non-unification s'aligne sur le but et la sémantique prévus de votre conception de l'énumération.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3