Warum kann der C # -Compiler keinen generischen Delegaten aus der Funktionssignatur ableiten? [Duplikat
Diese Frage hat hier bereits eine Antwort:
Warum kann C # aus diesem scheinbar einfachen, offensichtlichen Fall keinen Typ ableiten 5 AntwortenIch arbeite mit einer Funktion, die zwei Funktionen als Parameter verwendet und eine neue zusammengesetzte zurückgibt:
public static Action<T> Compose<T>(Action<T> first, Action second)
{
return new Action<T>(arg =>
{
first(arg);
second();
});
}
Ich habe bemerkt, dass der Compiler sich beschwert, wenn ich nicht @ spezifizieT
, wenn eine statische oder Member-Funktion gesendet wird (im Gegensatz zu einem tatsächlichenAction<T>
Objekt)
static void Main(string[] args)
{
// compiler error here
var composed = Compose(Test, () => Console.WriteLine(" world"));
composed("hello");
Console.ReadLine();
}
public static void Test(string arg)
{
Console.Write(arg);
}
Die Fehlermeldung:
Die Argumente für die Methode 'ConsoleTest.Program.Compose (System.Action, System.Action)' können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.
Meine Frag: Warum kann hier nicht auf das Typargument geschlossen werden? Die Signatur vonTest
ist zur Kompilierungszeit bekannt, nicht wahr? Gibt es wirklich eine Funktion, die Sie anstelle von @ setzen könnteTest
, würde dies dazu führen, dass die Signatur nicht eindeutig ist?
Footnote: Ich weiß, ich kann einfach sendennew Action<string>(Test)
anstattTest
zuCompose
(wie in @ vermerkdiese Frag) - meine Frage ist "warum", nicht "wie kann ich das machen".