Maison >développement back-end >C++ >Pourquoi C# génère-t-il une erreur « Invocation ambiguë » lors de l'utilisation de groupes de méthodes avec des méthodes déléguées surchargées ?

Pourquoi C# génère-t-il une erreur « Invocation ambiguë » lors de l'utilisation de groupes de méthodes avec des méthodes déléguées surchargées ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-13 10:35:43467parcourir

Why Does C# Throw an

Erreur d'appel ambigu du compilateur C# : groupe de méthodes et type de délégué

En C#, lors de l'appel d'une fonction avec plusieurs surcharges à l'aide de la syntaxe de groupe de méthodes, le compilateur peut rencontrer une erreur « appel ambigu ». Cette erreur se produit car le compilateur ne peut pas déterminer quelle surcharge appeler lorsqu'il existe deux groupes de méthodes avec des types de délégués compatibles.

Considérez l'exemple de code suivant :

<code class="language-csharp">public class ClassWithDelegateMethods
{
    public void Method(Func<string> func) { /* do something */ }
    public void Method(Action action) { /* do something */ }
}

public class ClassWithSimpleMethods
{
    public string GetString() { return ""; }
    public void DoNothing() { }
}

public class Program
{
    public static void Main(string[] args)
    {
        // 错误:歧义调用
        ClassWithDelegateMethods classWithDelegateMethods = new ClassWithDelegateMethods();
        classWithDelegateMethods.Method(classWithSimpleMethods.GetString); // 这里会报错
        classWithDelegateMethods.Method(classWithSimpleMethods.DoNothing); // 这里会报错
    }
}</code>
Les deux surcharges de

ClassWithDelegateMethods.Method peuvent être appelées sans aucun problème en utilisant des méthodes anonymes ou des expressions lambda. Cependant, appeler classWithSimpleMethods.GetString ou classWithSimpleMethods.DoNothing à l'aide de la syntaxe du groupe de méthodes entraîne une erreur d'ambiguïté.

La raison de cette erreur réside dans les règles de conversion implicites entre les groupes de méthodes et les types de délégués. Selon la spécification C#, il existe des conversions implicites entre les groupes de méthodes en types de délégués compatibles. Cependant, pour les groupes de méthodes avec surcharges, la spécification ne définit pas de mécanisme permettant de déterminer vers quelle surcharge convertir.

Éviter les erreurs ambiguës

Pour résoudre les erreurs d'ambiguïté, les groupes de méthodes peuvent être explicitement convertis en type de délégué requis. Par exemple :

<code class="language-csharp">// 无错误
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);
classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);</code>

Alternativement, à partir de C# 7.3, l'algorithme amélioré de sélection des candidats en surcharge du compilateur élimine ce problème. Par conséquent, en C# 7.3 et versions ultérieures, l’exemple de code ci-dessus doit être compilé sans conversion explicite.

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!

Déclaration:
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