CA2243: синтаксический анализ строковых литералов атрибута должен осуществляться правильно

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

Причина

Не удается правильно выполнить синтаксический анализ параметра строкового литерала атрибута для URL-адреса, идентификатора GUID или версии.

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

Поскольку атрибуты являются производными от System.Attribute и используются во время компиляции, их конструкторам могут передаваться только постоянные значения. Параметры атрибутов, которые должны представлять URL-адреса, идентификаторы GUID и версии, не могут быть типизированы как System.Uri, System.Guid и System.Version, так как эти типы не могут быть представлены в виде констант. Он должны быть представлены строками.

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

Это правило использует эвристику именования для поиска параметров, представляющих универсальный код ресурса (URI), глобальный уникальный идентификатор (GUID) или версию, и проверяет правильность переданного значения.

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

Измените строку параметра на URL-адрес, идентификатор GUID или версию в правильном формате.

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

Вывод предупреждения для этого правила можно отключить, если параметр не представляет URL-адрес, идентификатор GUID или версию.

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

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

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

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

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

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

Пример

В следующем примере показан код для атрибута AssemblyFileVersionAttribute, нарушающего это правило.

[AttributeUsage(AttributeTargets.Assembly, Inherited = false)]
[ComVisible(true)]
public sealed class AssemblyFileVersionAttribute : Attribute
{
    public AssemblyFileVersionAttribute(string version) { }

    public string? Version { get; set; }
}

// Since the parameter is typed as a string, it is possible
// to pass an invalid version number at compile time. The rule
// would be violated by the following code: [assembly : AssemblyFileVersion("xxxxx")]

Правило активируется следующими параметрами:

  • параметры, которые содержат "version" и не могут быть обработаны в System.Version;

  • параметры, которые содержат "guid" и не могут быть обработаны в System.Guid;

  • параметры, которые содержат "uri", "urn" или "url", и не могут быть обработаны в System.Uri.

См. также