¿Por qué cambiar para enum acepta la conversión implícita a 0 pero no para ningún otro entero?

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.