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.
Acción recomendada
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.