Creo que la respuesta a "¿Por qué las enumeraciones requieren un molde explícito para el tipo int?" es que las enumeraciones fuertemente tipadas según C# son una defensa útil contra errores de programación comunes.
Imagínese que tenía una aplicación de gestión de la pintura, sobre la base de dos enumeraciones:
enum Textures { Gloss, Satin, Matt };
enum Colors { White, Green, Red, Blue, Brown };
y un método sala de pintura de la siguiente manera:
private void PaintRoom (Textures texture, Colors color)
En un lenguaje con tipos fuertes enumeración como en C# , un comando como este:
// nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);
... harían un error en tiempo de compilación (no se puede poner color i nto donde se espera una textura y viceversa). Pero en los idiomas donde las enumeraciones no son fuertemente tipadas y/o pueden ocurrir conversiones implícitas (incluyendo C y C++), tanto nuestro Colors
como nuestro Textures
se pueden tratar como int
, así que podemos emitir un comando PaintRoom(Colors.White, Textures.Matt)
y compilaremos bien, pero terminamos con una habitación pintada de Rojo Brillante (0, 2) en lugar del Blanco Mate (2, 0) que pretendíamos y el código en una mirada rápida parece decir.
Las enumeraciones fuertemente tipadas son, en su mayoría, algo bueno, para evitar que personas accidentalmente pongan enums en lugares para los que no estaban destinados. Y donde alguien realmente quiere su enumeración como int
, C# obliga al codificador a dejar clara su intención al insistir en una conversión explícita.
¿Qué hay de convertir implícitamente una enumeración a su tipo de valor subyacente cuando se especifica explícitamente? es decir, "enum FilePermissionFlags: int" podría convertir implícitamente a int. – Lazlo
@Lazlo: ¿Y cómo se dice lo que había en el código fuente cuando la enumeración se cargó sin metadatos? Es algo muy extraño para cambiar el comportamiento. Realmente, lo que hubiera sido mejor en mi opinión eran tipos realmente enumerados para cosas como "Medallas", que no son convertibles a ningún tipo de entero, y un tipo especial de entero que es un "indicador uint" que tiene las operaciones bit a bit en él . El hecho de que los enteros se combinen con números pequeños * y * pequeños conjuntos de bits solo parece normal porque crecimos con él; de hecho, es realmente asqueroso. –
@Eric Lippert: ¿No hay ninguna marca posible para tal caso? Trabajas con el compilador diariamente, supongo. En cuanto a las banderas de bits, estoy de acuerdo. – Lazlo