Ответ 1
Вы должны указать компилятору определенный тип делегата. Например, вы можете использовать выражение лямбда:
Console.WriteLine(((Func<int, int>)(x => x + 1))(2));
EDIT: или да, вы можете использовать выражение создания делегата в соответствии с ответом Servy:
Console.WriteLine(new Func<int, int>(i => i + 1)(2));
Обратите внимание, что это не обычный вызов конструктора - это специальный синтаксис для создания делегата, который выглядит как обычный вызов конструктора. Тем не менее умный, хотя:)
Вы можете сделать его немного чище со вспомогательным классом:
public static class Functions
{
public static Func<T> Of<T>(Func<T> input)
{
return input;
}
public static Func<T1, TResult> Of<T1, TResult>
(Func<T1, TResult> input)
{
return input;
}
public static Func<T1, T2, TResult> Of<T1, T2, TResult>
(Func<T1, T2, TResult> input)
{
return input;
}
}
... затем:
Console.WriteLine(Functions.Of<int, int>(x => x + 1)(2));
Или:
Console.WriteLine(Functions.Of((int x) => x + 1)(2));