Я работаю с функцией, которая принимает две функции в качестве параметров, и возвращает новый сочинял один:Почему компилятор C# не может вывести делегат общего типа из сигнатуры функции?
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);
}
сообщение об ошибке:
The arguments for method 'ConsoleTest.Program.Compose(System.Action, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Мой вопрос: Почему аргумент типа не может быть выведен здесь? Подпись Test
известна во время компиляции, не так ли? Есть ли какая-то функция, которую вы могли бы поставить вместо Test
, что может привести к неоднозначности ее подписи?
Сноска: Я знаю, что могу просто послать new Action<string>(Test)
вместо Test
к Compose
(как отмечено в this question) - мой вопрос «почему», а не «как я могу это сделать».
FYI - 'Compose' исправляет это также. –
Посмотрите этот ответ: http://stackoverflow.com/questions/6229131/why-cant-c-sharp-infer-type-from-this-seemingly-simple-obvious-case – lukegravitt
Спасибо @lukegravitt - лучший ответ там ссылается на спецификацию языка, и сам Липперт перехватывает. – McGarnagle