次の方法で共有


ECMA-335 に従って呼び出し引数を強制する

ECMA-335 (表 III.9: 署名照合) では、呼び出し引数でサポートされる暗黙的な変換について説明されています。 この変更により、サポートされる変換のチェックが追加されます。

導入されたバージョン

6.0

変更内容

以前のバージョンの .NET の Just-In-Time (JIT) コンパイラでは、ECMA-335 に従った呼び出し引数は強制されません。 これにより、一部のプラットフォームで未定義の動作が発生します。 たとえば、x86 では、int レジスタとして long 値を渡した場合、レジスタは未定義の状態になります。

.NET 6 以降では、暗黙的な変換が許可されていない場合、JIT コンパイラによって InvalidProgramException がスローされます。 それでも許可される変換ケースが 2 つ存在します。

  • 64 ビット プラットフォームでの int8 ->nint (頻繁に使用され、不正なコードにならないため)
  • byref ->nint

変更理由

以前の動作では、Arm64 Apple などの一部のプラットフォームにおいて、暗黙的に不正なコードが生成されました。

.NET 6 に更新した後、この変更のためにアプリで InvalidProgramException 例外がスローされる場合は、影響を受ける引数で明示的な変換を使用するか、呼び出し先宣言を修正します。

影響を受ける API

なし。