CA1422: проверка совместимости платформы — устаревшие API
Свойство | Значение |
---|---|
Идентификатор правила | CA1422 |
Заголовок | Проверка совместимости платформ — устаревшие API |
Категория | Совместимость |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предупреждение |
Причина
API, помеченный как ObsoletedOSPlatformAttribute вызывающий, вызывается с сайта вызова, помеченного как поддержка устаревшей операционной системы (ОС). Это правило похоже на CA1416: проверка совместимости платформы, за исключением того, что она предупреждает об api, устаревших на данной платформе, и полностью неподдерживаемой.
Описание правила
Не рекомендуется вызывать API, устаревший в данной ОС (версии) с сайта вызова, доступного из этой ОС (версии). Рассмотрите возможность вызова устаревшего API вместо этого или защиты от вызова устаревшего API в затронутых операционных системах.
Устранение нарушений
Существуют различные способы устранения нарушения этого правила:
- Ограничьте сайт вызова операционным системам, которые не включают устаревшую версию, помечая ее или UnsupportedOSPlatformAttribute ObsoletedOSPlatformAttribute.
- Охраняйте вызов с помощью System.OperatingSystem API, например
if (!OperatingSystem.IsLinux())
. - Защитите вызов с помощью API, помеченного или UnsupportedOSPlatformGuardAttribute отрицаемого SupportedOSPlatformGuardAttribute.
Пример
В следующем фрагменте кода показано нарушение CA1422:
[SupportedOSPlatform("Windows")]
public void M1()
{
// Violates rule CA1422.
// This call site is reachable on 'Windows',
// but 'ObsoletedOnWindows62()'
// is obsoleted on 'Windows 6.2' and later.
ObsoletedOnWindows62();
}
[ObsoletedOSPlatform("Windows6.2")]
public void ObsoletedOnWindows62()
{ }
<SupportedOSPlatform("Windows")>
Public Sub M1()
' Violates rules CA1422.
' This call site is reachable on 'Windows',
' but 'ObsoletedOnWindows62()'
' is obsoleted on 'Windows 6.2' and later.
ObsoletedOnWindows62()
End Sub
<ObsoletedOSPlatform("Windows6.2")>
Public Sub ObsoletedOnWindows62()
End Sub
Следующий фрагмент кода исправляет нарушение путем добавления на сайт вызова атрибута UnsupportedOSPlatformAttribute , указывающего версию вызываемого метода, устарела.
[SupportedOSPlatform("Windows")]
[ObsoletedOSPlatform("Windows6.2")]
public void M1()
{
ObsoletedOnWindows62();
}
[ObsoletedOSPlatform("Windows6.2")]
public void ObsoletedOnWindows62()
{ }
<SupportedOSPlatform("Windows")>
<ObsoletedOSPlatform("Windows6.2")>
Public Sub M1()
ObsoletedOnWindows62()
End Sub
<ObsoletedOSPlatform("Windows6.2")>
Public Sub ObsoletedOnWindows62()
End Sub
Когда лучше отключить предупреждения
Это безопасно, чтобы отключить предупреждение из этого правила, если вы не обеспокоены вызовом устаревшего API или если вы знаете, что устаревший API никогда не будет вызываться в затронутой версии ОС.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1422
// The code that's violating the rule is on this line.
#pragma warning restore CA1422
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1422.severity = none
Чтобы отключить эту всю категорию правил, задайте уровень серьезности для категории none
в файле конфигурации.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Interoperability.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.