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
なし。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET