Maison >développement back-end >C++ >Pourquoi la syntaxe du groupe de méthodes provoque-t-elle des erreurs d'invocation ambiguës avec des surcharges de délégués ?
Erreurs d'appel ambiguës causées par la syntaxe du groupe de méthodes C# et la surcharge des délégués
Scénario :
Supposons que vous souhaitiez appeler une fonction qui a deux surcharges : une qui accepte un délégué Action et une autre qui accepte un délégué Func
Question :
Lorsque vous essayez d'appeler ces surcharges en utilisant la syntaxe de groupe de méthodes, vous rencontrerez une erreur d'appel ambigu du compilateur.
Explication :
La raison de cette ambiguïté réside dans les règles de conversion implicites pour les groupes de méthodes et les types de délégués. Selon la spécification C#, les groupes de méthodes peuvent être implicitement convertis en types de délégués compatibles. Cependant, la « compatibilité » dans ce contexte fait référence à la compatibilité des méthodes et des types de délégués, et non à la compatibilité des groupes de méthodes et des types de délégués.
Dans l'exemple donné, le groupe de méthodes classWithSimpleMethods.GetString
est un candidat valide pour les deux surcharges de délégués : classWithDelegateMethods.Method(Action)
et classWithDelegateMethods.Method(Func<string>)
. Puisqu'il n'existe pas de règles de type claires pour déterminer quelle conversion est la meilleure, le compilateur génère une erreur d'appel ambiguë.
Solution :
Pour résoudre cette ambiguïté, vous pouvez fournir un cast explicite au type de délégué correspondant, comme suit :
<code class="language-csharp">classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing); classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);</code>
Mise à jour C# 7.3 :
À partir de C# 7.3, vous n’obtenez plus d’erreurs d’appel ambiguës lors de l’utilisation de la syntaxe de groupe de méthodes. Grâce à un classement amélioré des candidats à la surcharge, le compilateur déduit désormais correctement le type de délégué attendu en fonction du contexte.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!