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.
Doporučená akce
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.