CA1028: O armazenamento de enumerações deve ser Int32

Property Valor
ID da regra CA1028
Título O armazenamento de enumerações deve ser Int32
Categoria Projetar
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Não

Causa

O tipo subjacente de uma enumeração não é System.Int32.

Por padrão, essa regra apenas analisa as enumerações visíveis externamente, mas isso é configurável.

Descrição da regra

Uma enumeração é um tipo de valor que define um conjunto de constantes nomeadas relacionadas. Por padrão, o tipo de dados System.Int32 é usado para armazenar o valor constante. Mesmo que seja possível alterar esse tipo subjacente, isso não é necessário ou recomendado na maioria dos cenários. Nenhum ganho de desempenho significativo é obtido usando um tipo de dados menor que Int32. Se você não puder usar o tipo de dados padrão, use um dos tipos integrais compatíveis com CLS (Common Language Specification): Byte, Int16, Int32 ou Int64 para certificar-se de que todos os valores da enumeração podem ser representados em linguagens de programação compatíveis com CLS.

Como corrigir violações

Para corrigir uma violação dessa regra, a menos que existam problemas de tamanho ou compatibilidade, use Int32. Para situações em que Int32 não é grande o suficiente para manter os valores, use Int64. Se a compatibilidade com versões anteriores exigir um tipo de dados menor, use Byte ou Int16.

Quando suprimir avisos

Suprime um aviso dessa regra somente se problemas de compatibilidade com versões anteriores assim exigirem. Em aplicativos, a não conformidade com essa regra geralmente não causa problemas. Em bibliotecas, onde a interoperabilidade de idioma é necessária, a não conformidade com essa regra pode afetar negativamente os usuários.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA1028
// The code that's violating the rule is on this line.
#pragma warning restore CA1028

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1028.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Configurar código para analisar

Use a opção a seguir para configurar em quais partes da base de código essa regra deve ser executada.

Você pode configurar essa opção apenas para essa regra, para todas as regras às quais ela se aplica ou para todas as regras nessa categoria (Design) às quais ela se aplica. Para saber mais, confira Opções de configuração de regra de qualidade de código.

Incluir superfícies de API específicas

É possível configurar em quais partes da base de código essa regra deverá ser executada, com base na acessibilidade. Por exemplo, para especificar que a regra deverá ser executada apenas na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig no projeto:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exemplo

O exemplo a seguir mostra duas enumerações que não usam o tipo de dados subjacente recomendado.

[Flags]
public enum Days : uint
{
    None = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    All = Monday | Tuesday | Wednesday | Thursday | Friday
}

public enum Color : sbyte
{
    None = 0,
    Red = 1,
    Orange = 3,
    Yellow = 4
}
<Flags()>
Public Enum Days As UInteger
    None = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    Friday = 16
    All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
End Enum

Public Enum Color As SByte
    None = 0
    Red = 1
    Orange = 3
    Yellow = 4
End Enum

O exemplo a seguir corrige a violação anterior alterando o tipo de dados subjacente para Int32.

[Flags]
public enum Days : int
{
    None = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    All = Monday | Tuesday | Wednesday | Thursday | Friday
}

public enum Color : int
{
    None = 0,
    Red = 1,
    Orange = 3,
    Yellow = 4
}
<Flags()>
Public Enum Days As Integer
    None = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    Friday = 16
    All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
End Enum

Public Enum Color As Integer
    None = 0
    Red = 1
    Orange = 3
    Yellow = 4
End Enum

Confira também