Можно ли объявлять и вызывать однократно лямбда-выражение в С#?
В VB.NET выражение lambda может быть объявлено и вызвано в одной строке:
'Output 3
Console.WriteLine((Function(num As Integer) num + 1)(2))
Возможно ли это в С#?
Ответ 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));
Ответ 2
Console.WriteLine(new Func<int, int>(i => i + 1)(2));
Использует несколько меньших скобок для использования конструктора Func, чем приведение.
Ответ 3
Да, хотя это грязно:
Console.WriteLine(((Func<int, int>) (num => num + 1))(2));
Ответ 4
Вид или, вам нужно будет использовать объект Func:
var square = new Func<double, double>(d => d*d)(2);
Console.WriteLine(square);