Coerce-Aufrufargumente gemäß ECMA-335
ECMA-335 (Tabelle III.9: Signaturabgleich) beschreibt, welche impliziten Konvertierungen für Aufrufargumente unterstützt werden. Durch diese Änderung wird die Überprüfung auf die unterstützten Konvertierungen erweitert.
Eingeführt in Version
6.0
Beschreibung der Änderung
In früheren .NET-Versionen erzwingt der Just-In-Time(JIT)-Compiler keine Aufrufargumente gemäß ECMA-335. Dies führt auf einigen Plattformen zu nicht definiertem Verhalten. Wenn Sie z. B. auf x86 einen long
-Wert als int
-Register übergeben, bleibt das Register undefiniert.
Ab .NET 6 löst der JIT-Compiler eine InvalidProgramException aus, wenn implizite Konvertierung nicht zulässig ist. Es gibt zwei Konvertierungsfälle, die weiterhin zulässig sind:
int8
–>nint
auf einer 64-Bit-Plattform (da sie häufig verwendet wird und nicht zu fehlerhaftem Code führt)byref
->nint
Grund für die Änderung
Das vorherige Verhalten führte zu einer automatischen fehlerhaften Codegenerierung auf einigen Plattformen, einschließlich Arm64 Apple.
Empfohlene Maßnahme
Wenn Sie auf .NET 6 aktualisiert haben und Ihre App aufgrund dieser Änderung InvalidProgramException-Ausnahmen auslöst, verwenden Sie eine explizite Konvertierung für das betroffene Argument, oder korrigieren Sie die Deklaration des Aufrufers.
Betroffene APIs
Keine.