Mi sono imbattuto in una strana situazione che non è ambigua, tuttavia il risolutore di sovraccarico non la pensa così. Considerare:Perché C# non può risolvere il sovraccarico corretto in questo caso?
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!
}
}
Come mai la chiamata a ParamTest
sovraccarichi viene risolto correttamente, ma Test
sovraccarico è ambigua?
Il tipo di ritorno di un metodo non viene considerato quando il compilatore seleziona un sovraccarico. Una conseguenza automatica di non dover effettivamente utilizzare il valore restituito quando si chiama un metodo. Risolto banalmente qui, basta usare 'Test (nuovo IntDel (X));' –
Credo che questo sia vero anche per Java e C++. Tuttavia non è una limitazione fondamentale del polimorfismo parametrico, ad esempio in Haskell è possibile sovraccaricare in base al tipo di ritorno. Il problema è che consentire l'overloading del tipo restituito può causare alcuni problemi con l'inferenza di tipo. – Bakuriu
Offtopic: Mi piace come quasi tutte le domande otterranno almeno un voto ravvicinato in questi giorni. XD –