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.
Action recommandée
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.