Como obter int de enum em C#: do iniciante ao profissional

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que enum sem int é como café sem cafeína?

\n\n

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

\n\n

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?

\n\n

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.

\n\n

1. Como o enum funciona em C#: um breve resumo

\n\n

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

\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

Isso é importante! Se o seu enum usar byte ou long, a simples conversão para int pode resultar em erro ou perda de dados.

\n\n

2. Método nº1: conversão explícita (cast) — o clássico

\n\n

A maneira mais óbvia e rápida é usar o operador de conversão de tipo. Funciona quando você sabe exatamente que o tipo base é 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); // Exibe: 2
\n\n

Vantagens:

\n
    \n
  • Máximo desempenho — o compilador gera uma única instrução IL.
  • \n
  • Simplicidade e legibilidade.
  • \n
\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 long ou byte (requer dupla conversão).
  • \n
\n\n

Quando usar: em 90% dos casos, quando seu enum é padrão (: int).

\n\n

3. Método nº2: Convert.ToInt32 — o canivete suíço

\n\n

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

\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

Vantagens:

\n
    \n
  • Funciona com qualquer tipo base (byte, short, long, etc.).
  • \n
  • Não requer conhecimento explícito do tipo do enum.
  • \n
\n

Desvantagens:

\n
    \n
  • Mais lento que o cast direto (chamada de método virtual).
  • \n
  • Pode lançar InvalidCastException se você passar algo que não é um enum.
  • \n
\n\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\n

4. Método nº3: GetHashCode() — um truque perigoso (não faça isso!)

\n\n

Na internet, você pode encontrar o conselho "genial" de usar GetHashCode(). Sim, tecnicamente ele

Blogs

Book Recommendations