Hoffentlich kann mir jemand das erklären. Sorry, wenn es eine Wiederholung ist, um die Schlüsselwörter zu erklären, was ich sehe über mir sind jetzt ..C# Aufruf ist mehrdeutig beim Übergeben einer Methodengruppe als Stellvertreter
hier ist ein Code, der
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));
}
}
kompiliert und hier ist ein Code, der nicht
tutclass 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;
}
}
Durch das Hinzufügen der Konstruktorüberladung erzeugt dies offensichtlich Mehrdeutigkeit, aber ich bin mir nicht sicher warum. Math.Sqrt ist nicht überladen und hat eindeutig einen Rückgabetyp von double, nicht Task < double>. Hier
ist der Fehler:
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>>)'
Kann jemand erklären, warum die Wahl auf den Compiler nicht offensichtlich ist?
einfache Abhilfe für diejenigen, die Pflege:
class Program
{
static void Main(string[] args)
{
new Transformer<double, double>(d => Math.Sqrt(d));
}
}
Btw gibt es eine andere Abhilfe: 'neue Transformer ((Func ) Math.Sqrt);' –
Szer
Könnte ein Fehler sein. Ich war selbst schon einige Male an der Grenze der Typinferenz und habe es ähnlich scheitern sehen. Ich werde dir sagen, was wirklich schrecklich ist - du verbindest deine Konstruktor-Anrufe nicht miteinander. Tut Tut. 'öffentliche Transformer (Func actor): dies (input => Task.Run ((=) (Akteur (Eingabe))). Zweifel, das würde beheben, aber es wird unglückliche Bugs verhindern! –
Will
@Will fair Kommentar obwohl dies (offensichtlich hoffe ich) eine einfache Repro. Ich sehe dieses Verhalten tatsächlich in den Microsoft Dataflow-Klassen (https://msdn.microsoft.com/en-us/library/hh228603 (v = vs.110) .aspx): TransformBlock <,> etc ... – eisenpony