2009-03-06 9 views

Respuesta

20

En C#, a diferencia de Java, las enumeraciones no están marcadas. Puede tener cualquier valor del tipo subyacente. Es por eso que es muy importante verificar su entrada.

if(!Enum.IsDefined(typeof(MyEnum), value)) 
    throw new ArgumentOutOfRangeException(); 
+1

Hay algunas características de C# que anhelo como desarrollador de Java (LINQ!), Pero aquí Java realmente lo hizo bien ... –

+0

@saua: No necesariamente. Son ventajas de este enfoque, así como desventajas. –

+0

La principal ventaja de este punto es que puede combinar los valores, que también debe marcar con el atributo [Flags]. –

1

Dado que su enumeración se basa en int, puede aceptar cualquier valor que int pueda. Y dado que le está diciendo al compilador explícitamente (mediante conversión) que está bien convertir 4 en su enumeración, lo hace.

1

Cada enumeración tiene un tipo numérico subyacente (por ejemplo, int) que se utiliza para la representación. Incluso si un valor no tiene un nombre, es un valor posible que la enumeración puede tener.

1

Lo que otros no dijeron: Con el casting, le dice al compilador que sabe lo que está haciendo. Entonces, si lo dice, trate esto como un valor enum, lo hace. Los otros carteles señalaron por qué esto todavía está permitido, ya que el compilador de C# no permite muchas cosas malas, incluso si dices que sabes lo que estás haciendo.

Sería muy malo si no se permitiera el valor, porque entonces no se podía guardar un valor de indicador como int. O bien, alguien tenía que comprobar si el int es una de las combinaciones permitidas, lo que puede ser mucho si usa una enumeración de indicador (con valores que pueden combinarse).

Cuestiones relacionadas