Почему компилятор C # не может определить делегат универсального типа из сигнатуры функции? [Дубликат]

На этот вопрос уже есть ответ:

Почему C # не может определить тип из этого, казалось бы, простого и очевидного случая 5 ответов

Я работаю с функцией, которая принимает две функции в качестве параметров и возвращает новую составную:

public static Action<T> Compose<T>(Action<T> first, Action second)
{
    return new Action<T>(arg =>
    {
        first(arg);
        second();
    });
}

Я заметил, что компилятор жалуется, если я не укажуT, при отправке статической функции или функции-члена (в отличие от фактическогоAction<T> объект):

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);
}

Сообщение об ошибке:

Аргументы для метода 'ConsoleTest.Program.Compose (System.Action, System.Action)' не могут быть выведены из использования. Попробуйте указать аргументы типа явно.

Мой вопро: Почему аргумент типа не может быть выведен здесь? ПодписьTest известен во время компиляции, не так ли? Есть ли какая-то функция, которую вы могли бы поставить вместоTest, что бы его подпись была неоднозначной?

Footnote: я знаю, что могу просто отправитьnew Action<string>(Test) вместо тогоTest вCompose (как отмечено вэтот вопро) - мой вопрос «почему», а не «как я могу это сделать».

Ответы на вопрос(2)

Ваш ответ на вопрос