Conversión de int a enum en C#: 5 errores fatales y cómo evitarlos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Conversión de int a enum en C#: por qué rompe el código y cómo solucionarlo correctamente

\n\n

Cada desarrollador de C#, incluso con unos meses de experiencia, tarde o temprano se enfrenta a la pregunta: «How do I cast int to enum in C#?». Esta consulta en Stack Overflow ha acumulado cientos de miles de visitas, y con razón. Parece sencillo: escribes (MyEnum)myInt y listo. Pero el diablo, como siempre, está en los detalles. Una conversión incorrecta de int a enum puede provocar excepciones, errores difíciles de detectar e incluso la caída de un servidor en producción.

\n\n

En este artículo, analizaremos los 5 errores principales al convertir int a enum, mostraremos ejemplos prácticos en C# y proporcionaremos un algoritmo claro para una conversión segura. Si programas en C# y usas enumeraciones, esta información te ahorrará horas de depuración.

\n\n

Error n.º 1: Conversión ingenua sin verificación — «¿Y si el número no es válido?»

\n\n

La forma más común que los principiantes encuentran en Internet es el cast directo:

\n\n
enum Status\n{\n    Active = 1,\n    Inactive = 2,\n    Pending = 3\n}\n\nint input = 5; // El usuario envió algo incorrecto\nStatus status = (Status)input; // Sin error, pero status == (Status)5\nConsole.WriteLine(status); // Salida: 5 — ¡valor basura!\n
\n\n

El código se compilará y ejecutará sin excepción. Pero la variable status ahora contiene el valor 5, que no existe en el enum Status. En C#, las enumeraciones son, en esencia, números enteros con nombres. El compilador no verifica si el valor pertenece al conjunto de constantes. Esta es una trampa clásica: la conversión de int a enum funciona técnicamente, pero lógicamente es un error.

\n\n

Cómo evitarlo: use siempre el método Enum.IsDefined() antes del cast.

\n\n
if (Enum.IsDefined(typeof(Status), input))\n{\n    Status status = (Status)input;\n}\nelse\n{\n    // Manejo de error: registro, valor predeterminado o excepción\n    Console.WriteLine($"Valor no válido {input} para Status");\n}\n
\n\n

Recuerde: Enum.IsDefined() es lento en llamadas frecuentes, pero para operaciones puntuales es un guardián ideal.

\n\n

Error n.º 2: Ignorar las enumeraciones con banderas ([Flags])

\n\n

Cuando trabaja con enumeraciones marcadas con el atributo [Flags], la lógica de verificación cambia. Enum.IsDefined() devolverá false para combinaciones de banderas, incluso si son correctas.

\n\n
[Flags]\nenum Permissions\n{\n    None = 0,\n    Read = 1,\n    Write = 2,\n    Execute = 4\n}\n\nint input = 3; // Read + Write\nif (Enum.IsDefined(typeof(Permissions), input))\n{\n    // ¡Esto no se ejecutará! 3 no es una constante individual\n}\n
\n\n

Para las banderas, debe usar otra verificación: si todos los bits en el número corresponden a valores definidos.

\n\n
bool IsValidFlags<T>(int value) where T : Enum\n{\n    int allValues = 0;\n    foreach (var v in Enum.GetValues<T>())\n    {\n        allValues |= Convert.ToInt32(v);\n    }\n    return (value & ~allValues) == 0;\n}\n\nif (IsValidFlags<Permissions>(input))\n{\n    Permissions perms = (Permissions)input; // Seguro\n}\n
\n\n

O, más simple, use la verificación incorporada Enum.IsDefined() para cada bandera individual, si son pocas.

\n\n

Error n.º 3: Olvidar el manejo de números negativos y desbordamiento

\n\n

Enum en C# se basa por defecto en int, pero puede ser byte, short, long, etc. Si convierte un int a un enum cuyo tipo base es byte, corre el riesgo de obtener una excepción por desbordamiento o, peor aún, una distorsión silenciosa del valor.

\n\n
enum SmallEnum : byte\n{\n    A = 0,\n    B = 255\n}\n\nint bigValue = 300;\nSmallEnum se = (SmallEnum)bigValue; // ¿Error de compilación? ¡No!\n// Pero el valor se truncará: se == (SmallEnum)44 (300 % 256)\n

                
                

Blogs

Book Recommendations