Speriamo che qualcuno possa spiegarmelo. Scusate se è una ripetizione, le parole chiave per spiegare quello che sto vedendo sono al di là di me per ora ..C# La chiamata è ambigua quando si passa un gruppo di metodi come delegato
qui è un codice che compila
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(Math.Sqrt);
}
}
class Transformer<Tin, Tout>
{
Func<Tin, Task<Tout>> actor;
public Transformer(Func<Tin, Tout> actor)
{
this.actor = input => Task.Run<Tout>(() => actor(input));
}
}
e qui è un codice che non lo fa
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(Math.Sqrt);
}
}
public class Transformer<Tin, Tout>
{
Func<Tin, Task<Tout>> actor;
public Transformer(Func<Tin, Tout> actor)
{
this.actor = input => Task.Run<Tout>(() => actor(input));
}
public Transformer(Func<Tin, Task<Tout>> actor)
{
this.actor = actor;
}
}
Aggiungendo il sovraccarico del costruttore, questo crea apparentemente ambiguità ma non sono sicuro del perché. Math.Sqrt non è sovraccarico e ha chiaramente un tipo di ritorno doppio, non Task < double>.
Ecco l'errore:
The call is ambiguous between the following methods or properties: 'ConsoleApplication1.Transformer<double,double>.Transformer(System.Func<double,double>)' and 'ConsoleApplication1.Transformer<double,double>.Transformer(System.Func<double,System.Threading.Tasks.Task<double>>)'
qualcuno può spiegare perché la scelta non è ovvio per il compilatore?
soluzione facile per coloro che hanno a cuore:
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(d => Math.Sqrt(d));
}
}
Btw c'è un'altra soluzione: 'nuovo Transformer ((Func ) Math.Sqrt);' –
Szer
Potrebbe essere un bug. Sono stato al limite dell'inferenza di tipo un paio di volte me stesso, e ho visto fallire in questo modo. Ti dirò cos'è veramente terribile - non stai incatenando le chiamate del tuo costruttore. Tut tut 'public Transformer (Func actor): this (input => Task.Run (() => actor (input)))'. Dubbio che risolverebbe, ma preverrà bug infelici! –
Will
@Salvo commento equo anche se questo è (ovviamente, spero) una semplice riproduzione. In realtà sto vedendo questo comportamento nelle classi Microsoft Dataflow (https://msdn.microsoft.com/en-us/library/hh228603 (v = vs.110) .aspx): TransformBlock <,> ecc ... – eisenpony