ECMA-335 (表 III.9: シグネチャ マッチング) では、呼び出し引数でサポートされる暗黙的な変換について説明します。 この変更により、サポートされている変換のチェックが追加されます。
導入されたバージョン
6.0
変更の説明
以前の .NET バージョンでは、Just-In-Time (JIT) コンパイラは ECMA-335 に従って呼び出し引数を強制しません。 これにより、一部のプラットフォームで未定義の動作が発生します。 たとえば、x86 では、long
レジスタにint
値を渡すと、そのレジスタは未定義になります。
.NET 6 以降では、暗黙的な変換が許可されていない場合、JIT コンパイラは InvalidProgramExceptionをスローします。 引き続き許可される変換ケースは 2 つあります。
-
int8
->nint
64 ビット プラットフォーム (頻繁に使用され、不適切なコードにつながるわけではないため) -
byref
->nint
変更の理由
以前の動作により、Arm64 Apple を含む一部のプラットフォームでは、サイレントで不適切なコード生成が発生しました。
推奨されるアクション
.NET 6 に更新し、この変更によりアプリが InvalidProgramException 例外をスローする場合は、影響を受ける引数に明示的な変換を使用するか、呼び出し先の宣言を修正します。
影響を受ける API
なし。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET