ハードウェアに組み込みの IsSupported チェックは、入れ子にされた型によって異なる場合があります
<Isa>.X64.IsSupported
(<Isa>
は System.Runtime.Intrinsics.X86 名前空間のクラスを指す) をチェックすると、場合によっては、前のバージョンの .NET とは異なる結果が生成されるようになりました。
ヒント
ISA は業界標準アーキテクチャの略です。
導入されたバージョン
5.0
変更の説明
.NET の前のバージョンでは、ハードウェアに組み込まれている型 System.Runtime.Intrinsics.X86 (たとえば、System.Runtime.Intrinsics.X86.Aes) で、入れ子にされた X64
クラスが公開されませんでした。 このような型の場合、<Isa>.X64.IsSupported
を呼び出すと、<Isa>
の親クラスの入れ子 X64
クラスで IsSupported
プロパティに解決されました。 これは、<Isa>.IsSupported
で false
が返されるときでも、このプロパティで true
が返される可能性を意味しました。
.NET 5 以降のバージョンでは、すべての System.Runtime.Intrinsics.X86 型で、サポートを適宜報告する入れ子 X64
クラスが公開されます。 これにより、一般階層が正しく維持され、<Isa>.X64.IsSupported
が true
の場合、<Isa>.IsSupported
も true
になると想定できます。
変更理由
<Isa>.X64.IsSupported
が true
の場合、<Isa>.IsSupported
も暗黙的に true
になることが意図されていました。 しかしながら、C# におけるメンバー解決のしくみに起因し、入れ子 X64
クラスが与えられていないクラスでは意図どおりになるとは限らず、ユーザー コードでバグが見つかる状況が発生しました。
推奨アクション
必要に応じて、該当する ISA がないか確認するよう、IsSupported
をチェックするコードを調整します。
影響を受ける API
- System.Runtime.Intrinsics.X86.Aes.X64.IsSupported
- System.Runtime.Intrinsics.X86.Avx.X64.IsSupported
- System.Runtime.Intrinsics.X86.Avx2.X64.IsSupported
- System.Runtime.Intrinsics.X86.Fma.X64.IsSupported
- System.Runtime.Intrinsics.X86.Pclmulqdq.X64.IsSupported
- System.Runtime.Intrinsics.X86.Sse3.X64.IsSupported
- System.Runtime.Intrinsics.X86.Ssse3.X64.IsSupported
.NET