Почему компилятор 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
(как отмечено вэтот вопро) - мой вопрос «почему», а не «как я могу это сделать».