根据 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

无。