"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Pueden las enumidades en C# contener múltiples valores con la misma constante subyacente, y cuáles son las implicaciones?

¿Pueden las enumidades en C# contener múltiples valores con la misma constante subyacente, y cuáles son las implicaciones?

Publicado el 2025-03-24
Navegar:728

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

múltiples valores en declaraciones enum: una inmersión más profunda en el clr

a diferencia de las estructuras, los enums se clasifican como tipos de valor livianos que representan un conjunto de constantes nombradas. Sin embargo, lo que presenta la pregunta es una observación intrigante de que enums aparentemente puede permitir que múltiples valores se asignen a la misma constante.

en los detalles de implementación del tiempo de ejecución del lenguaje común (CLR), queda claro que los enums son fundamentalmente similares a las estructuras. Detrás de escena, enums se derivan de la clase base System.enum y son esencialmente estructuras con valores constantes predefinidos.

Considere la declaración de enum de ejemplo:

public enum Color
{
    Red = 1,
    Blue = 1,
    Green = 1
}

clr interpreta internamente esta declaración de la siguiente manera:

public struct Color : System.Enum
{
    public const int Red = 1;
    public const int Blue = 1;
    public const int Green = 1;
}

mientras C# prohíbe la declaración de clase base explícita para las estructuras, el CLR genera esta representación para enums.

La presencia de constantes múltiples con el mismo valor en un tipo enum no plantea un problema. Sin embargo, esta asignación de valor no única puede dar como resultado un comportamiento inesperado durante la conversión al tipo enum.

por ejemplo:

Color color1 = (Color)1;
Color color2 = (Color)Enum.Parse(typeof(Color), "1");

tanto color1 como color2 se establecerán en el valor rojo porque la primera asignación de valor es arbitraria. Técnicamente, ni color1 ni color2 se asignan rojo; más bien, mantienen el valor 1. Pero cuando se muestran, el rojo es lo que verá.

Además, las operaciones de comparación entre los valores de enum no unique pueden producir resultados sorprendentes:

// true (Red is Green??)
bool b = Color.Red == Color.Green;

Esta igualdad se mantiene verdadera porque el valor numérico subyacente para rojo y verde es 1.

Si bien este comportamiento no es inherentemente problemático, garantiza la consideración cuando se emplea enums con valores no universitarios. Es esencial determinar si esta no unicidad se alinea con el propósito y la semántica previstas de su diseño enum.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3