Introdução: por que enum sem int é como café sem cafeína?
\n\nImagine a situação: você está escrevendo um código legal em C#, usando enumerações (enum) para armazenar status de pedidos, dias da semana ou níveis de acesso. Tudo bonito e legível. Mas de repente surge uma tarefa: salvar esse valor em um banco de dados, enviá-lo por uma API HTTP ou apenas exibi-lo no log. E então você se depara com uma parede — o enum precisa ser transformado em int.
Isso não é apenas um "desejo" de livro didático. Segundo as estatísticas do Stack Overflow, a pergunta "Get int value from enum in C#" acumula centenas de milhares de visualizações. Até desenvolvedores experientes às vezes se confundem: casting? Convert.ToInt32? E se o tipo base do número inteiro não for int?
Neste artigo, vamos abordar todas as maneiras legais de obter o valor inteiro de um enum em C#. Começando pela simples conversão de tipos e terminando com truques avançados com Unsafe.As (sim, isso também existe!). Você descobrirá qual método é mais rápido, qual é mais seguro e qual é melhor não usar em produção.
1. Como o enum funciona em C#: um breve resumo
\n\nAntes de converter, vamos relembrar os fundamentos. Em C#, enum é um tipo de valor que herda de System.Enum, e seu tipo base (underlying type) padrão é int. Mas você pode especificar explicitamente outro 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\nIsso é importante! Se o seu enum usar byte ou long, a simples conversão para int pode resultar em erro ou perda de dados.
2. Método nº1: conversão explícita (cast) — o clássico
\n\nA maneira mais óbvia e rápida é usar o operador de conversão de tipo. Funciona quando você sabe exatamente que o tipo base é int.
enum Day { Monday = 1, Tuesday = 2, Wednesday = 3 }\n\nDay today = Day.Tuesday;\nint dayValue = (int)today; // Resultado: 2\n\nConsole.WriteLine(dayValue); // Exibe: 2\n\nVantagens:
\n- \n
- Máximo desempenho — o compilador gera uma única instrução IL. \n
- Simplicidade e legibilidade. \n
Desvantagens:
\n- \n
- Se o tipo base não for
int, o compilador emitirá um erro ou aviso. \n - Não funciona com enums definidos como
longoubyte(requer dupla conversão). \n
Quando usar: em 90% dos casos, quando seu enum é padrão (: int).
3. Método nº2: Convert.ToInt32 — o canivete suíço
\n\nO método Convert.ToInt32() é um canivete suíço para conversão. Ele aceita um object e tenta convertê-lo para int através da interface 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\nVantagens:
\n- \n
- Funciona com qualquer tipo base (
byte,short,long, etc.). \n - Não requer conhecimento explícito do tipo do enum. \n
Desvantagens:
\n- \n
- Mais lento que o cast direto (chamada de método virtual). \n
- Pode lançar
InvalidCastExceptionse você passar algo que não é um enum. \n
Quando usar: quando você está escrevendo código genérico ou trabalhando com um enum cujo tipo base é desconhecido em tempo de compilação.
\n\n4. Método nº3: GetHashCode() — um truque perigoso (não faça isso!)
\n\nNa internet, você pode encontrar o conselho "genial" de usar GetHashCode(). Sim, tecnicamente ele