次の方法で共有


ECMA-335 に従った強制呼び出し引数

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

なし。