CA1422:验证平台兼容性 - 已过时的 API

属性
规则 ID CA1422
标题 验证平台兼容性 - 已过时的 API
类别 互操作性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为警告

原因

标记为 ObsoletedOSPlatformAttribute 的 API 是从标记为支持已过时操作系统 (OS) 的调用站点调用的。 此规则类似于 CA1416:验证平台兼容性,只不过它警告给定平台上已过时的 API 与完全不支持的 API。

规则说明

不建议从可从该 OS(版本)访问的调用站点调用在给定 OS(版本)中过时的 API。 请考虑改为调用未过时的 API,或防止在受影响的操作系统上调用过时的 API。

如何解决冲突

可通过多种方式解决此规则的冲突:

示例

以下代码片段演示了 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,或者知道永远不会在受影响的 OS 版本上调用过时的 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

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅