CA1069: перечисления не должны иметь повторяющиеся значения

Свойство Значение
Идентификатор правила CA1069
Заголовок перечисления не должны иметь повторяющихся значений
Категория Проектирование
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Перечисление содержит несколько элементов, которым явным образом присвоено одно и то же значение константы.

Описание правила

Каждый элемент перечисления должен иметь уникальное константное значение или явно назначаться предыдущим элементом перечисления, чтобы указать явное намерение совместного использования значения. Например:

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 = 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
}

Когда лучше отключить предупреждения

Не отключайте предупреждения для этого правила.

См. также