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ë?
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é.