26

在 VB.NET 中,可以在同一行声明和调用 lambda 表达式:

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

这在 C# 中可能吗?

4

4 回答 4

44

您必须告诉编译器特定的委托类型。例如,您可以转换lambda 表达式:

Console.WriteLine(((Func<int, int>)(x => x + 1))(2));

编辑:或者是的,您可以按照 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));
于 2012-07-09T15:18:33.773 回答
33
Console.WriteLine(new Func<int, int>(i => i + 1)(2));

使用更少的括号来使用Func' 的构造函数而不是强制转换。

于 2012-07-09T15:21:10.167 回答
14

是的,虽然它很乱:

Console.WriteLine(((Func<int, int>) (num => num + 1))(2));
于 2012-07-09T15:18:48.313 回答
1

Kind 或者,您必须使用 Func 对象:

 var square = new Func<double, double>(d => d*d)(2);
 Console.WriteLine(square);
于 2012-07-09T15:21:24.847 回答