根据 ECMA-335 强制调用参数
ECMA-335(表 III.9:签名匹配)说明了调用参数支持哪些隐式转换。 此次更改添加了对支持的转换的检查。
引入的版本
6.0
更改说明
在以前的 .NET 版本中,实时 (JIT) 编译器不会根据 ECMA-335 强制转换调用参数。 这会导致某些平台上出现未定义的行为。 例如,在 x86 上,将值 long
作为 int
寄存器传递会使寄存器保持未定义状态。
从 .NET 6 开始,如果不允许隐式转换,则 JIT 编译器将引发 InvalidProgramException。 仍允许两种转换情况:
- 64 位平台上的
int8
->nint
(因为它经常使用,不会导致错误的代码) byref
->nint
更改原因
以前的行为在某些平台上(包括 Arm64 Apple)上会导致静默的错误代码生成。
建议的操作
如果更新到 .NET 6 后,应用由于此更改而引发 InvalidProgramException 异常,则对受影响的参数使用显式转换或修复被调用方声明。
受影响的 API
无。