Erreur d'appel ambigu du compilateur C# : méthode anonyme et groupe de méthodes
C# fournit deux syntaxes pour appeler des fonctions : les méthodes anonymes (ou syntaxe lambda) et les groupes de méthodes. Des ambiguïtés peuvent survenir lors de l'utilisation de la syntaxe de groupe de méthodes lorsqu'une fonction comporte plusieurs surcharges acceptant différents types de délégués.
Considérez l'exemple de code suivant :
<code class="language-csharp">class Program { public static void Main() { // 匿名方法(编译成功) Method(() => classWithSimpleMethods.GetString()); Method(() => classWithSimpleMethods.DoNothing()); // 使用显式转换的方法组(也编译成功) Method((Func<string>)classWithSimpleMethods.GetString); Method((Action)classWithSimpleMethods.DoNothing); // 方法组(错误:“歧义调用”) Method(classWithSimpleMethods.GetString); Method(classWithSimpleMethods.DoNothing); } public static void Method(Func<string> func) { /* 执行某些操作 */ } public static void Method(Action action) { /* 执行某些操作 */ } }</code>
Dans cet exemple, la fonction Method
a deux surcharges, une qui accepte Action
et l'autre qui accepte Func<string>
. Lorsque la fonction est appelée à l’aide d’une méthode anonyme ou d’une conversion explicite vers le type délégué correct, le code se compile sans erreur. Cependant, lors de l’utilisation de la syntaxe de groupe de méthodes, le compilateur signale une erreur « appel ambigu ».
Comprendre l'ambiguïté
La spécification du langage C# indique qu'il existe des conversions implicites des groupes de méthodes en types de délégués compatibles. Cependant, dans ce cas, le compilateur est confronté à une ambiguïté car le groupe de méthodes classWithSimpleMethods.GetString
peut être implicitement converti en Func<string>
et Action
.
Selon la spécification, la résolution de surcharge implique la sélection du candidat le plus applicable en fonction des types d'arguments correspondants. Bien que la liste des paramètres de la méthode GetString
soit compatible avec les deux surcharges, le compilateur ne peut pas déterminer la meilleure correspondance car il ne prend pas en compte le type de retour lors de la résolution de la surcharge.
Résoudre les ambiguïtés
Pour résoudre les ambiguïtés, vous pouvez utiliser une conversion explicite vers le type de délégué correct, comme indiqué dans l'exemple de code. Cependant, cette approche peut s’avérer fastidieuse et sujette aux erreurs.
Heureusement, dans C# 7.3 et versions ultérieures, le compilateur s'est amélioré pour gérer cette situation. Les candidats à la surcharge sont désormais classés en fonction de leur compatibilité avec le type de délégué cible, éliminant ainsi le besoin de conversions explicites dans ce cas.
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!