2012-09-21 9 views
7

Por lo general, si uso el interruptor para enumeraciones en C#, tengo que escribir algo así:es que hay una advertencia (error), similar a C4061 para C#

switch (e) 
{ 
    case E.Value1: 
     //... 
     break; 

    case E.Value2: 
     //... 
     break; 

     //... 
    default: 
     throw new NotImplementedException("..."); 
} 

En C++ (para VS) que pude habilite las advertencias C4061 y C4062 para este conmutador, realice errores y tenga una verificación en tiempo de compilación. En C# tengo que mover esta verificación al tiempo de ejecución ...

¿Alguien sabe cómo en C# puedo hacer que se compruebe en tiempo de compilación? Tal vez hay una advertencia, desactivada por defecto, que me perdí, o de alguna otra manera?

+2

Por favor explique las advertencias para los que no están familiarizados con los C++ Cxyz-advertencias –

+0

se explican bastante bien en msdn. En pocas palabras, en el código C++ si los habilita, use "cambiar" para alguna enumeración y olvide procesar algunos de los valores de enumeración (en "caso" separado) recibirá una advertencia durante la compilación – Alek86

Respuesta

5

No, no debe haber una verificación en tiempo de compilación: es legítimo tener un conmutador/caja que solo maneje algunos de los valores nombrados. Habría sido posible para incluirlo, pero hay algunos problemas.

En primer lugar, es totalmente válida (por desgracia) por un valor de enumeración no tener cualquiera de los valores "con nombre":

enum Foo 
{ 
    Bar = 0, 
    Baz = 1 
} 
... 
Foo nastyValue = (Foo) 50; 

Dado que cualquier valor es factible dentro del interruptor de encendido/caso, el compilador No puedo saber que no pretendías tratar de manejar un valor sin nombre.

En segundo lugar, no funcionaría bien con Flags enumeraciones - el compilador realmente no sabe qué valores deben ser combinaciones convenientes. Es podría inferir eso, pero sería un poco asqueroso.

En tercer lugar, no siempre es lo que quiere, a veces realmente solo quiere responder a algunos casos. No me gustaría tener que suprimir las advertencias de forma razonablemente regular.

Puede usar Enum.IsDefined para comprobar esto por adelantado, pero eso es relativamente ineficiente.

Estoy de acuerdo que todo esto es un poco de dolor - enumeraciones son un poco de una zona desagradable cuando se trata de .NET :(

+2

gracias. Pero no estoy de acuerdo con "No, no puede haber una verificación en tiempo de compilación". En C++ también puede establecer cualquier valor en enumeración, pero hay una oportunidad para comprobar, que está procesando todos los valores esperados. – Alek86

+0

@ Alek86: Bien, editaremos esto. –

+0

tal vez conozcas un ¿Hay alguna herramienta de terceros (como StyleCop) que pueda verificar esto? – Alek86

Cuestiones relacionadas