Sdílet prostřednictvím


Přepojit argumenty volání podle ECMA-335

ECMA-335 (tabulka III.9: Porovnávání podpisů) popisuje, které implicitní převody jsou podporovány pro argumenty volání. Tato změna přidává kontrolu podporovaných převodů.

Zavedená verze

6.0

Změna popisu

V předchozích verzích .NET kompilátor JIT (just-in-time) nepředá volání argumentů podle ECMA-335. To vede k nedefinovanýmu chování na některých platformách. Například na platformě x86 předání long hodnoty jako int registru ponechá registr nedefinovaný.

Počínaje rozhraním .NET 6, pokud není povolen implicitní převod, kompilátor JIT vyvolá InvalidProgramExceptionvýjimku . Existují dva případy převodu, které jsou stále povolené:

  • int8 –>nint na 64bitové platformě (protože se často používá a nemá vést ke špatnému kódu)
  • byref ->nint

Důvod změny

Předchozí chování způsobilo tiché a chybné generování kódu na některých platformách, včetně Arm64 Apple.

Pokud jste aktualizovali na .NET 6 a vaše aplikace InvalidProgramException vyvolá výjimky z důvodu této změny, použijte explicitní převod pro ovlivněný argument nebo opravte deklaraci volaného.

Ovlivněná rozhraní API

Nezaokrouhlovat.