CA1069: Enumerações não devem ter valores duplicados

Property Valor
ID da regra CA1069
Título Enumerações não devem ter valores duplicados
Categoria Projetar
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Como sugestão

Causa

Uma enumeração tem diversos membros explicitamente atribuídos ao mesmo valor de constante.

Descrição da regra

Cada membro de enumeração deve ter um valor constante exclusivo ou ser explicitamente atribuído com um membro anterior na enumeração para indicar a intenção explícita de compartilhar valor. Por exemplo:

enum E
{
   Field1 = 1,
   AnotherNameForField1 = Field1,   // This is fine
   Field2 = 2,
   Field3 = 2,   // CA1069: This is not fine. Either assign a different constant value or 'Field2' to indicate explicit intent of sharing value.
}

Essa regra ajuda a detectar bugs funcionais introduzidos nos seguintes cenários:

  • Erros de digitação acidental, em que o usuário digitou acidentalmente o mesmo valor constante para vários membros.
  • Erros de copiar e colar, em que o usuário copiou uma definição de membro existente e renomeou o membro, mas esqueceu de alterar o valor.
  • Mesclar a resolução de vários branches, em que um novo membro foi adicionado com um nome diferente, mas o mesmo valor em branches diferentes.

Como corrigir violações

Para corrigir uma violação, atribua um novo valor constante exclusivo ou atribua com um membro anterior na enumeração para indicar a intenção explícita de compartilhar o mesmo valor. Por exemplo, o snippet de código a seguir mostra uma violação da regra e algumas maneiras de corrigir a violação:

enum E
{
   Field1 = 1,
   AnotherNameForField1 = Field1,   // This is fine
   Field2 = 2,
   Field3 = 2,   // CA1069: This is not fine. Either assign a different constant value or 'Field2' to indicate explicit intent of sharing value.
}
enum E
{
   Field1 = 1,
   AnotherNameForField1 = Field1,   // This is fine
   Field2 = 2,
   Field3 = 3,   // This is now fine
}
enum E
{
   Field1 = 1,
   AnotherNameForField1 = Field1,   // This is fine
   Field2 = 2,
   Field3 = Field2,   // This is also fine
}

Quando suprimir avisos

Não suprima as violações dessa regra.

Confira também