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.

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.