Compartilhar via


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.

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.