Hay un:
enum SomeEnum { A = 0, B = 1, C = 2 }
Ahora el comstackdor me permite escribir:
SomeEnum x = SomeEnum.A; switch(x) { case 0: // <--- Considered SomeEnum.A break; case SomeEnum.B: break; case SomeEnum.C: break; default: break; }
0
se considera SomeItems.A
. Pero no puedo escribir
SomeEnum x = SomeEnum.A; switch(x) { case 0: break; case 1: // <--- Here is a compilation error. break; case SomeEnum.C: break; default: break; }
¿Por qué solo existe una conversión implícita para 0
?
De ECMA-334 (Especificación del lenguaje C #)
13.1.3 Conversiones de enumeración implícitas
Una conversión de enumeración implícita permite que el decimal-entero-literal 0 se convierta a cualquier tipo de enumeración.
El valor por defecto de enum es 0
y en el momento de la comstackción se sabe por qué está permitido en la instrucción switch. Para un valor distinto de 0
, no se puede determinar en tiempo de comstackción si este valor existirá en la enumeración o no.
enum (referencia de C #)
Asignar valores adicionales a nuevas versiones de enumeraciones, o cambiar los valores de los miembros enum en una nueva versión, puede causar problemas para el código fuente dependiente. A menudo ocurre que los valores de enum se utilizan en instrucciones de conmutación, y si se agregaron elementos adicionales al tipo de enumeración, la prueba de los valores predeterminados puede ser verdadera de manera inesperada.
También agregaría que la syntax con 0
lugar de la enum
exacta en la statement de switch
puede convertirse en propensa a errores. Considera el siguiente código:
enum TestEnum { NA = 0, A }
y entonces
var e = TestEnum.NA; switch(e) { case 0: { break; } case TestEnum.A: { break; } }
Esto comstack y funciona bien. Sin embargo, si por alguna razón, la statement enum
cambia a
enum TestEnum { NA = 1, A }
todo se romperá
Aunque en la mayoría de las situaciones el valor predeterminado para enum
es 0
y por esa razón esta syntax puede tener lugar, usaría la enum
exacta.