Introducción: ¿por qué un enum sin int es como un café sin cafeína?
\n\nImagínese la situación: está escribiendo código genial en C#, usando enumeraciones (enum) para almacenar estados de pedidos, días de la semana o niveles de acceso. Todo es bonito y legible. Pero de repente llega la tarea: guardar ese valor en una base de datos, enviarlo por HTTP API o simplemente mostrarlo en un registro. Y aquí se topa con una pared: el enum debe convertirse a int.
Esto no es solo un "capricho" de un libro de texto. Según las estadísticas de Stack Overflow, la pregunta "Get int value from enum in C#" acumula cientos de miles de visitas. Incluso los desarrolladores experimentados a veces se confunden: ¿casting? ¿Convert.ToInt32? ¿Y si el tipo base del número entero no es int?
En este artículo, analizaremos todas las formas legales de obtener un valor entero de un enum en C#. Desde la simple conversión de tipos hasta trucos avanzados con Unsafe.As (¡sí, eso también existe!). Aprenderá qué método es más rápido, cuál es más seguro y cuál es mejor no usar en producción.
1. Cómo funciona un enum en C#: breve introducción
\n\nAntes de convertir, recordemos los fundamentos. En C#, un enum es un tipo de valor que hereda de System.Enum, y su tipo base (underlying type) por defecto es int. Pero puede especificar explícitamente otro tipo:
public enum Status : byte\n{\n New = 0,\n Active = 1,\n Closed = 2\n}\n\npublic enum Priority : long\n{\n Low = 10,\n Medium = 50,\n High = 100\n}\n\n¡Esto es importante! Si su enum usa byte o long, la simple conversión a int puede provocar un error o pérdida de datos.
2. Método n.º 1: conversión explícita (cast) — el clásico
\n\nLa forma más obvia y rápida es usar el operador de conversión de tipo. Funciona cuando sabe con certeza que el tipo base es int.
enum Day { Monday = 1, Tuesday = 2, Wednesday = 3 }\n\nDay today = Day.Tuesday;\nint dayValue = (int)today; // Resultado: 2\n\nConsole.WriteLine(dayValue); // Muestra: 2\n\nVentajas:
\n- \n
- Máximo rendimiento: el compilador genera una instrucción IL. \n
- Simplicidad y legibilidad. \n
Desventajas:
\n- \n
- Si el tipo base no es
int, el compilador generará un error o una advertencia. \n - No funciona con
enumdefinidos comolongobyte(requiere doble conversión). \n
Cuándo usarlo: en el 90% de los casos, cuando su enum es estándar (: int).
3. Método n.º 2: Convert.ToInt32 — el todoterreno
\n\nEl método Convert.ToInt32() es una navaja suiza para la conversión. Acepta un object e intenta convertirlo a int a través de la interfaz IConvertible.
enum Status { New = 0, Active = 1, Closed = 2 }\n\nStatus current = Status.Active;\nint statusCode = Convert.ToInt32(current); // Resultado: 1\n\nConsole.WriteLine(statusCode); // 1\n\nVentajas:
\n- \n
- Funciona con cualquier tipo base (
byte,short,long, etc.). \n - No requiere conocer explícitamente el tipo del enum. \n
Desventajas:
\n- \n
- Más lento que la conversión directa (llamada a método virtual). \n
- Puede lanzar una
InvalidCastExceptionsi se pasa algo que no es un enum. \n
Cuándo usarlo: cuando escribe código genérico o trabaja con un enum cuyo tipo base se desconoce en tiempo de compilación.
\n\n4. Método n.º 3: GetHashCode() — un truco peligroso (¡no lo haga!)
\n\nEn Internet puede encontrar el consejo "genial" de usar GetHashCode(). Sí, técnicamente