Подтвердить что ты не робот

Можно ли объявлять и вызывать однократно лямбда-выражение в С#?

В VB.NET выражение lambda может быть объявлено и вызвано в одной строке:

'Output 3
Console.WriteLine((Function(num As Integer) num + 1)(2))

Возможно ли это в С#?

4b9b3361

Ответ 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);