Cómo obtener int de enum en C#: de principiante a profesional

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

Introducción: ¿por qué un enum sin int es como un café sin cafeína?

\n\n

Imagí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.

\n\n

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?

\n\n

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.

\n\n

1. Cómo funciona un enum en C#: breve introducción

\n\n

Antes 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:

\n\n
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.

\n\n

2. Método n.º 1: conversión explícita (cast) — el clásico

\n\n

La 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.

\n\n
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\n

Ventajas:

\n
    \n
  • Máximo rendimiento: el compilador genera una instrucción IL.
  • \n
  • Simplicidad y legibilidad.
  • \n
\n

Desventajas:

\n
    \n
  • Si el tipo base no es int, el compilador generará un error o una advertencia.
  • \n
  • No funciona con enum definidos como long o byte (requiere doble conversión).
  • \n
\n\n

Cuándo usarlo: en el 90% de los casos, cuando su enum es estándar (: int).

\n\n

3. Método n.º 2: Convert.ToInt32 — el todoterreno

\n\n

El 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.

\n\n
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\n

Ventajas:

\n
    \n
  • Funciona con cualquier tipo base (byte, short, long, etc.).
  • \n
  • No requiere conocer explícitamente el tipo del enum.
  • \n
\n

Desventajas:

\n
    \n
  • Más lento que la conversión directa (llamada a método virtual).
  • \n
  • Puede lanzar una InvalidCastException si se pasa algo que no es un enum.
  • \n
\n\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\n

4. Método n.º 3: GetHashCode() — un truco peligroso (¡no lo haga!)

\n\n

En Internet puede encontrar el consejo "genial" de usar GetHashCode(). Sí, técnicamente

Blogs

Book Recommendations