Argumentos de llamada de conversión según ECMA-335

ECMA-335 (Tabla III.9: Coincidencia de firmas) describe qué conversiones implícitas se admiten para los argumentos de llamada. Este cambio agrega la comprobación de las conversiones admitidas.

Versión introducida

6.0

Descripción del cambio

En versiones anteriores de .NET, el compilador Just-In-Time (JIT) no convirtió los argumentos de llamada según ECMA-335. Esto conduce a un comportamiento indefinido en algunas plataformas. Por ejemplo, en x86, pasar un valor long como un registro int deja el registro sin definir.

A partir de .NET 6, si no se permite la conversión implícita, el compilador JIT inicia una excepción InvalidProgramException. Hay dos casos de conversión que todavía se admiten:

  • int8 ->nint en la plataforma de 64 bits (porque se usa con frecuencia y no genera código incorrecto)
  • byref ->nint

Motivo del cambio

El comportamiento anterior provocó la generación de código silencioso e incorrecto en algunas plataformas, incluido Arm64 Apple.

Si ha actualizado a .NET 6 y la aplicación produce excepciones InvalidProgramException debido a este cambio, use una conversión explícita para el argumento afectado o corrija la declaración del destinatario.

API afectadas

Ninguno.