Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1422 |
| Заголовок | Проверка совместимости платформ — устаревшие API |
| Категория | Совместимость |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предупреждение |
| Применимые языки | C# и Visual Basic |
Причина
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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.