CA1028: хранилище перечислений должно иметь тип Int32

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

Причина

Базовый типа для перечисления не System.Int32.

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

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

Перечисление является типом значения, которое определяет набор связанных именованных констант. По умолчанию для хранения значений констант используется тип данных System.Int32. Этот базовый тип можно изменить, но в большинстве случаев это не нужно или не рекомендуется. За счет использования типа данных меньше Int32 не удается достичь заметного выигрыша в производительности. Если вы не можете использовать тип данных по умолчанию, следует выбрать один из целочисленных типов, совместимых с CLS, — Byte, Int16, Int32 или Int64. Это позволяет гарантировать, что все значения перечисления могут быть представлены в языках программирования, совместимых с CLS.

Устранение нарушений

Если не существует проблем с размером или совместимостью, используйте Int32, чтобы устранить это нарушение. Если Int32 недостаточно велик для хранения значений, используйте Int64. Если для обратной совместимости требуется тип данных меньшего размера, используйте Byte или Int16.

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

Отменяйте предупреждение из этого правила только в том случае, если это требуется для устранения проблем с обратной совместимостью. В приложениях несоответствие этому правилу обычно не вызывает проблем. В библиотеках, где требуется языковая совместимость, несоблюдение этого правила может негативно сказаться на работе пользователей.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка кода для анализа

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

Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (конструкторе), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Включение определенных контактных зон API

Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Пример

В следующем примере показаны два перечисления, которые не используют рекомендуемый базовый тип данных.

[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

Следующий пример устраняет предыдущее нарушение, изменяя базовый тип данных на 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

См. также