2009-03-11 16 views
7

Si declara una enumeración en C#, el tipo predeterminado es automáticamente int.C# Enums and casting

Entonces, ¿por qué en un enunciado de caso u otras instancias cuando se usa la enumeración hay que volver a refundir explícitamente para usar los valores? ¿De qué sirve tener un tipo subyacente si tienes que justificar explícitamente o simplemente estoy haciendo algo mal aquí?

private enum MyEnum 
     { 
      Value1, 
      Value2, 
      Value3 
     } 

    switch (somevalue) 
       { 
        case (int)MyEnum.Value1: 
         someothervar = "ss"; 
         break; 
        case (int)MyEnum.Value2: 
         someothervar = "yy"; 
         break; 
        case (int)MyEnum.Value3: 
         someothervar = "gg"; 
         break; 
       } 
+0

Estos fragmentos de código se ven un poco incómodos. Usted define una enumeración y el parámetro entrante (algún valor) es un int. Me parece extraño ... –

Respuesta

2

Si somevalue es de tipo MyEnum, usted no tiene que echar a un int.

public enum Color 
{ 
    Red, 
    Blue, 
    Green 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Color color = Color.Red; 

     switch (color) 
     { 
      case Color.Red: 
       break; 

      case Color.Blue: 
       break; 

      case Color.Green: 
       break; 
     } 
    } 
} 
15

¿Cuál es el tipo de algún valor? Si el tipo es MyEnum casting no es necesario y debería funcionar sin error.

Si el tipo es int, entonces sí, tendrá que convertirlo a MyEnum para cambiarlo/caso correctamente. Pero puede hacer esto un poco más simple lanzando el valor en lugar de cada declaración de caso. Por ejemplo

switch((MyEnum)somevalue) { 
    case MyEnum.Value1: ... 
} 
+0

Realmente -1? ¿Puedo obtener una justificación? – JaredPar

+1

No lo rechacé, pero para mí el problema es la suposición de que el elenco de la enumeración tendrá éxito. ¿Qué pasa si el valor no es un valor enum válido? Ver mi respuesta más tarde. –

+2

@Walden, es irrelevante para la pregunta. La pregunta es "¿por qué no compilará esto?". Lanzar un int a una enume que deriva de int tendrá éxito sin importar el valor. – JaredPar

4

Obviamente, somevalue es un número entero en lugar de escribir explícitamente como su enumeración. Debe tener en cuenta que underlying value of an enum is just the "storage type" y no es intercambiable implícitamente. Sin embargo, se puede utilizar fácilmente el operador de conversión para que su código simple y "más" Tipo de seguridad:

private enum MyEnum { Value1, Value2, Value3 } 

switch ((MyEnum)somevalue) 
{ 
    case MyEnum.Value1: 
     someothervar = "ss"; 
     break; 
    case MyEnum.Value2: 
     someothervar = "yy"; 
     break; 
    case MyEnum.Value3: 
     someothervar = "gg"; 
     break; 
    default: 
     throw new NotSupportedException(); 
} 

el tiempo que le gustaría un diseño donde no tiene que convertir de un entero a una enumeración, pero a menudo veces al leer desde el disco o DB este no es el caso.

1

Como han dicho otros:

  • Si somevalue es de tipo MyEnum, que no debería tener que emitir.
  • Si está leyendo desde una base de datos o un archivo de texto , puede usar el método Parse de enum, para obtener un valor enum de una cadena.
  • Si absolutamente debe comparar un int, es más eficiente incluir en el interruptor a MyEnum, en lugar de convertir cada valor de MyEnum a un int.