2008-10-16 10 views

Respuesta

15

dar una respuesta ligeramente diferente ... mientras que los valores son de tipo seguro desde el punto de vista de fundición, todavía están sin control una vez que hayan sido emitidos - es decir

enum Foo { A = 1, B = 2, C = 3 }  
static void Main() 
{ 
    Foo foo = (Foo)500; // works fine 
    Console.WriteLine(foo); // also fine - shows 500 
} 

Por esta razón, usted debe tomar asegúrese de verificar los valores, por ejemplo, con un default en un switch que arroja una excepción.

también puede comprobar el (por [Flags] valores no) a través de:

bool isValid = Enum.IsDefined(typeof(Foo), foo); 

+0

+1 para la sugerencia Enum.IsDefined. – OregonGhost

+0

Oh, este es un buen consejo. No sabía esto ... siempre supuse que arrojaría una InvalidCastException o algo así. Definitivamente +1 de mi parte –

+0

+1. Enum.IsDefined es un gran héroe anónimo ... –

11

Sí lo son.

La siguiente es de http://www.csharp-station.com/Tutorials/Lesson17.aspx

Enums se escriben fuertemente constantes. Son tipos esencialmente únicos que le permiten asignar nombres simbólicos a valores integrales. En la tradición de C#, están fuertemente tipados, lo que significa que una enumeración de un tipo no puede asignarse implícitamente a una enumeración de otro tipo, aunque el valor subyacente de sus miembros sea el mismo. En la misma línea, los tipos integrales y las enumeraciones no son implícitamente intercambiables. Todas las asignaciones entre diferentes tipos de enumeración y tipos integrales requieren un lanzamiento explícito.

0

Yes they are.

enumeraciones son constantes inflexible. Son esencialmente tipos únicos que le permiten asignar nombres simbólicos a valores integrales . En la tradición de C#, que están fuertemente tipado, lo que significa que una enumeración de un tipo no puede ser implícitamente asignado a una enumeración de otro tipo a pesar de que la valor subyacente de sus miembros son la misma. En la misma línea, los tipos y enum integrales no son implícitamente intercambiables. Todas las asignaciones entre diferentes tipos de enum y tipos integrales requieren un lanzamiento explícito .

+0

Re tipos enteros: a excepción del literal 0, que * está * implícito. –

0

Sí.

C#: tipos de enumeración:

: un tipo de fallos de enumeración de los valores mencionados.

-Evita errores de programación

-El usuario puede controlar el tipo subyacente (por defecto es int)

-También puede controlar los valores subyacentes

0

Técnicamente no, ya que puede representar una enumeración como valor de base (int, largo, etc.). Sin embargo, si se asegura de que solo utiliza la enumeración por los nombres provistos, recibirá errores de tiempo de compilación si cambia el nombre de un valor enumerado sin actualizar sus referencias. En este sentido sí, es tipo seguro.

0

llego tarde a la fiesta aquí, pero quería que tirar un poco de algo extra ... Una actualización del .NET Framework Design Guidelines de Krzysztof Cwalina. Además del excelente consejo anterior sobre verificación para asegurar que se pase un valor válido a sus Enumeraciones, esto proporciona otra guía y consejos sobre cómo usarlos de manera efectiva, un montón de errores (especialmente implicados Flags enums), etc.

2

Para aquellos que sugieran usar Enum.IsDefined para hacer la validación de argumentos ... ¡no! Por Brad Abrams (del Framework Design Guidlines Update on Enum Design):

En realidad, hay dos problemas con Enum.IsDefined(). En primer lugar, carga el reflejo y un montón de metadatos de tipo frío, lo que lo convierte en una llamada engañosamente costosa. En segundo lugar, como la nota alude a que hay un problema de versiones aquí.

+0

Buena llamada; Me perdí esa nota completa en mi primera lectura de eso hoy. –

+0

@John Rudy: ¡Gracias! Ya sabía sobre esos problemas, pero es bueno poder señalar cierta documentación al respecto, especialmente con un ejemplo. –

0

sí que r de tipo fuerte safed u puede no que no hace la conversión impilcit de enumeración variables constantes a valor integeral u hv 2 expilcitly hacen dat por ejemplo días enum { sol, mon } int e = (int) days.sun; console.writeline (e);

0

C# enumeraciones son de tipo significado segura

  1. No se puede convertir implícitamente del tipo subyacente a la enumeración real
  2. Además, no se puede asignar un valor de una enumeración a otra enumeración, a pesar de que los tipos subyacentes de las dos enumeraciones son iguales. Siempre se requiere un lanzamiento explícito.
  3. Las enumeraciones hacen que su código sea más legible y más fácil de mantener.

He venido a través de un excelente video tutorial sobre enumeraciones que exponen su tipo de naturaleza segura. Eche un vistazo here y there.

Cuestiones relacionadas