Pourquoi C# ne peut-il pas résoudre la surcharge correcte dans ce cas?

J'ai rencontré une situation étrange qui n'est pas ambiguë, mais le résolveur de surcharge ne le pense pas. Considérez:

public static class Program
{
    delegate int IntDel();
    delegate string StringDel();

    delegate void ParamIntDel(int x);
    delegate void ParamStringDel(string x);

    static void Test(IntDel fun) { }
    static void Test(StringDel fun) { }
    static void ParamTest(ParamIntDel fun) { }
    static void ParamTest(ParamStringDel fun) { }

    static int X() { return 42; }
    static void PX(int x) { }

    public static void Main(string[] args)
    {
        ParamTest(PX); // OK
        Test(X); // Ambiguos call!
    }
}

Comment se fait-il que l'appel aux surcharges ParamTest soit résolu correctement, mais que la surcharge Test soit ambiguë?

21
demandé sur Vilx- 2015-02-24 16:29:15

1 réponses

Peut-être parce que https://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx

La signature d'une méthode n'inclut pas spécifiquement le type de retour, ni le modificateur params qui peut être spécifié pour le paramètre le plus à droite.

Et la seule différence entre IntDel et StringDel est la valeur de retour.

Plus précisément: https://msdn.microsoft.com/en-us/library/ms173171.aspx

Dans le contexte de surcharge de méthode, la signature d'une méthode n'inclut pas la valeur de retour. mais dans le contexte des délégués, la signature inclut la valeur de retour. En d'autres termes, une méthode doit avoir le même type de retour que le délégué.

37
répondu xanatos 2015-02-24 13:37:34