Maison > développement back-end > C++ > Pourquoi C# renvoie-t-il une erreur « Invocation ambiguë » lors de l'utilisation de groupes de méthodes mais pas de méthodes anonymes ?

Pourquoi C# renvoie-t-il une erreur « Invocation ambiguë » lors de l'utilisation de groupes de méthodes mais pas de méthodes anonymes ?

Susan Sarandon
Libérer: 2025-01-13 06:08:12
original
500 Les gens l'ont consulté

Why Does C# Throw an

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal