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 Antworten

Ich 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".

Antworten auf die Frage(2)

Ihre Antwort auf die Frage