2011-10-07 16 views
7

Disculpas de antemano, ya que estoy seguro de que alguien debe haber preguntado esto antes, pero no puedo encontrarlo.Enumeraciones, valores superpuestos, C#

Acabo de sorprenderme, un colega y yo agregamos el mismo valor para una enumeración y la compilamos, p.

enum MyEnum 
    { 
    mine = 1, 
    his = 1 
    } 

Parece C/C++ también lo admite (?). ¿Algún motivo para este comportamiento, en los casos en que sea útil? Vi un caso con idiomas diferencia humana (uno = 1, eins = 1, etc.) pero no estoy convencido de

Gracias

+0

Así que tal vez usted podría hacer esto 'enumeración MyEnum { minas [obsoleto] = 1, su = 1 }' – V4Vendetta

+0

Es de suponer que, si usted está haciendo los valores explícitos que * Care * acerca de cuáles son esos valores, entonces tales conflictos no deberían ocurrir. Si no le importa qué valor representa cada miembro, simplemente no puede hacer que sean explícitos y no habrá conflictos. –

Respuesta

8

Tomemos un ejemplo sencillo

enum PrivilegeLevel 
{ 
    None, 
    Reporter, 
    Reviewer, 
    Admin, 
    DefaultForNewUser = None, 
    DefaultForProjectOwner = Reviewer, 
}; 
+0

Parece una mala idea debido a la semántica de las versiones binarias de las constantes. – CodesInChaos

+0

¿Qué quieres decir con versionar la semántica de las constantes? – crazyjul

+0

Las constantes de @crazyjul no se pueden versionar. Si cambia una constante (vea, eso es un oxímoron), todas las asambleas que hicieron uso de ella alguna vez están rotas porque todavía usan el valor anterior. No cambiarías el valor de pi, ¿verdad? Pero es posible que desee cambiar los niveles de privilegio predeterminados. –

0

La idea detrás de los tipos enumerados es crear nuevos tipos de datos que pueden asumir solo un> rango de valores restringido.

Lo que hizo es legal y el compilador no debe dar ningún error ya que enum representa solo una constante. Simplemente le estás dando a tu constante un nombre lógico.

Puede asignar los mismos valores a dos o más constantes enum cuando necesite separar las constantes nombradas. Digamos que tiene un esquema de color que usa el mismo color básico detrás de ellos, pero los esquemas deben separarse lógicamente. Entonces puede usar los mismos valores para las constantes enum. Pero aún hay mejores formas de hacerlo.

+1

"Si asigna el mismo valor a dos o más constantes enum, el propósito total de las enumeraciones se ve disminuido". Estoy en desacuerdo. El propósito de las enumeraciones es permitir el uso de nombres en lugar de números mágicos. No veo cómo tener dos nombres con el mismo número mágico es malo. –

+0

@ R.MartinhoFernandes: Estoy totalmente de acuerdo con su desacuerdo. Hay momentos en que los alias son algo bueno. –

+0

Supongo que no es peor que un typedef de C++, simplemente sorprendido en el momento – tony