Forcer les arguments d’appel selon ECMA-335

ECMA-335 (Tableau III.9 : Correspondance de signature) décrit les conversions implicites prises en charge pour les arguments d’appel. Ce changement ajoute la vérification des conversions prises en charge.

Version introduite

6.0

Description de la modification

Dans les versions .NET précédentes, le compilateur juste-à-temps (JIT) ne force pas les arguments d’appel selon ECMA-335. Cela conduit à un comportement non défini sur certaines plateformes. Par exemple, sur x86, le passage d’une valeur long en tant que registre int laisse le registre non défini.

À compter de .NET 6, si la conversion implicite n’est pas autorisée, le compilateur JIT lève une exception InvalidProgramException. Deux cas de conversion sont toujours autorisés :

  • int8 ->nint sur une plateforme 64 bits (car elle est souvent utilisée et ne génère pas de code incorrect)
  • byref ->nint

Raison du changement

Le comportement précédent a provoqué une génération de code incorrecte et silencieuse sur certaines plateformes, notamment Arm64 Apple.

Si vous avez effectué une mise à jour vers .NET 6 et que votre application lève des exceptions InvalidProgramException en raison de ce changement, utilisez une conversion explicite pour l’argument affecté ou corrigez la déclaration appelée.

API affectées

Aucun.