CA1422:验证平台兼容性 - 已过时的 API
属性 | 值 |
---|---|
规则 ID | CA1422 |
标题 | 验证平台兼容性 - 已过时的 API |
类别 | 互操作性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 作为警告 |
原因
标记为 ObsoletedOSPlatformAttribute 的 API 是从标记为支持已过时操作系统 (OS) 的调用站点调用的。 此规则类似于 CA1416:验证平台兼容性,只不过它警告给定平台上已过时的 API 与完全不支持的 API。
规则说明
不建议从可从该 OS(版本)访问的调用站点调用在给定 OS(版本)中过时的 API。 请考虑改为调用未过时的 API,或防止在受影响的操作系统上调用过时的 API。
如何解决冲突
可通过多种方式解决此规则的冲突:
- 通过使用 UnsupportedOSPlatformAttribute 或 ObsoletedOSPlatformAttribute 标记来将调用站点限制为不包含已过时版本的操作系统。
- 使用 System.OperatingSystem API 保护调用,例如
if (!OperatingSystem.IsLinux())
。 - 使用带 UnsupportedOSPlatformGuardAttribute 注释或否定 SupportedOSPlatformGuardAttribute 的 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
有关详细信息,请参阅如何禁止显示代码分析警告。