Udostępnij za pośrednictwem


Argumenty wywołania coerce zgodnie z ECMA-335

ECMA-335 (Tabela III.9: Dopasowywanie podpisów) opisuje, które niejawne konwersje są obsługiwane dla argumentów wywołania. Ta zmiana dodaje sprawdzanie obsługiwanych konwersji.

Wprowadzona wersja

6.0

Opis zmiany

W poprzednich wersjach platformy .NET kompilator just in time (JIT) nie zmusza argumentów wywołania zgodnie z ECMA-335. Prowadzi to do niezdefiniowanego zachowania na niektórych platformach. Na przykład na x86 przekazanie long wartości jako int rejestru pozostawia rejestr niezdefiniowany.

Począwszy od platformy .NET 6, jeśli niejawna konwersja nie jest dozwolona, kompilator JIT zgłasza błąd InvalidProgramException. Istnieją dwa przypadki konwersji, które są nadal dozwolone:

  • int8 —>nint na 64-bitowej platformie (ponieważ jest często używana i nie prowadzi do nieprawidłowego kodu)
  • byref ->nint

Przyczyna wprowadzenia zmiany

Poprzednie zachowanie spowodowało dyskretne, złe generowanie kodu na niektórych platformach, w tym Arm64 Apple.

Jeśli zaktualizowano platformę .NET 6, a aplikacja zgłasza InvalidProgramException wyjątki z powodu tej zmiany, użyj jawnej konwersji dla argumentu, którego dotyczy problem, lub napraw deklarację wywoływaną.

Dotyczy interfejsów API

Brak.