En el abscence de un miembro de "default", creo que es valioso tener un valor que representa el literal int 0.
No importa qué, una enumeración dada será creado con el valor literal 0. La mayor parte caso directo aquí es como un miembro de una estructura. Una estructura C# siempre tendrá un constructor predeterminado vacío que inicializa todos los campos a su valor predeterminado. En el caso de una enumeración, ese será el valor literal 0. La pregunta es cómo manejarlo.
Para mí, esto es un problema de estilo: si la enumeración no se inicializa explícitamente a un valor, ¿se le debe dar un valor válido arbitrario o un valor específico que indique una falta de inicialización explícita?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
En el caso de v1, si se inspecciona el campo de color Será explícitamente ser etiquetado como un campo no inicializado. En v2, el campo simple será "Rojo". No hay forma de que un programador detecte entre y el conjunto explícito a "Rojo" o un valor predeterminado implícito a "Rojo".
Otro caso donde esto causa un problema es hacer una instrucción de conmutación contra un valor enum. Vamos a alterar levemente la definición de Color2.
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch (p1.color) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
El modificador maneja todos los valores explícitos de la enumeración. Sin embargo, este código fallará para el constructor predeterminado del ejemplo <Color2> y no hay manera de suprimir este constructor.
Esto nos lleva a una regla ligeramente más importante: tener un valor de enumeración explícita para el valor literal 0.
De acuerdo, la solución más limpia es un tipo que admite nulo. También se asigna a los esquemas DB. –
Es lamentable que las enumeraciones en .NET no lo obliguen a pasar un valor válido en absoluto. Podría pasar (Color) 123123 que se compilaría y funcionaría bien - el método Draw debería hacer la validación :( –
Probablemente una herencia de C, donde el compilador no sabe si se usa una enumeración como un verdadero enumerado tipo, o como un conjunto de banderas. Así que arroja sus manos al aire y se rinde. –