Coagir argumentos de chamada de acordo com o ECMA-335
O ECMA-335 (Tabela III.9: Correspondência de Assinaturas) descreve quais conversões implícitas têm suporte para argumentos de chamada. Essa alteração adiciona verificação para as conversões com suporte.
Versão introduzida
6,0
Descrição das alterações
Nas versões anteriores do .NET, o compilador JIT (just-in-time) não coagi os argumentos de chamada de acordo com o ECMA-335. Isso leva a um comportamento indefinido em algumas plataformas. Por exemplo, em x86, passar um valor long
como um registro int
deixa o registro indefinido.
A partir do .NET 6, se a conversão implícita não for permitida, o compilador JIT lançará um InvalidProgramException. Há dois casos de conversão que ainda são permitidos:
int8
->nint
na plataforma de 64 bits (porque ela é usada com frequência e não leva a código incorreto)byref
->nint
Motivo da alteração
O comportamento anterior causou uma geração de código silenciosa e ruim em algumas plataformas, incluindo o Arm64 Apple.
Ação recomendada
Se você atualizou para o .NET 6 e seu aplicativo gerar exceções InvalidProgramException devido a essa alteração, use uma conversão explícita para o argumento afetado ou corrija a declaração do receptor.
APIs afetadas
Nenhum.