SYSLIB0055:具有带符号参数的 AdvSimd.ShiftRightLogicalRoundedNarrowingSaturate* 方法已过时
从 .NET 9 开始,接受带符号整数的以下方法已过时:
- AdvSimd.Arm64.ShiftRightLogicalRoundedNarrowingSaturateScalar(Vector64<Int64>, Byte)
- AdvSimd.Arm64.ShiftRightLogicalRoundedNarrowingSaturateScalar(Vector64<Int16>, Byte)
- AdvSimd.Arm64.ShiftRightLogicalRoundedNarrowingSaturateScalar(Vector64<Int32>, Byte)
- AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateLower(Vector128<Int16>, Byte)
- AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateLower(Vector128<Int64>, Byte)
- AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateLower(Vector128<Int32>, Byte)
- AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateUpper(Vector64<SByte>, Vector128<Int16>, Byte)
- AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateUpper(Vector64<Int16>, Vector128<Int32>, Byte)
- AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateUpper(Vector64<Int32>, Vector128<Int64>, Byte)
在代码中调用这些方法会在编译时生成警告 SYSLIB0055
。
过时的原因
ARM 高级 SIMD UQRSHRN
指令执行无符号饱和窄化运算。 因此,其结果始终是无符号的。 但受影响的 API 已接受并返回带符号类型,这意味着,如果遵循 API 说明而不是指令说明,它们将无法按预期工作。 此外,无法通过纠正底层实现来执行带符号饱和窄化运算并返回带符号的结果。
解决方法
有意将数据转换为带符号类型并调用相应的无符号重载,例如 AdvSimd.ShiftRightLogicalRoundedNarrowingSaturateUpper(Vector64<UInt32>, Vector128<UInt64>, Byte)。 然后有意将结果转换为带符号类型。
抑制警告
如果必须使用已过时的 API,可在代码或项目文件中禁止显示警告。
若只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用警告。
// Disable the warning.
#pragma warning disable SYSLIB0055
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0055
若要禁止显示项目中的所有 SYSLIB0055
警告,请将属性 <NoWarn>
添加到项目文件。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0055</NoWarn>
</PropertyGroup>
</Project>
有关详细信息,请参阅取消警告。