26

VB.NET では、ラムダ式を宣言して同じ行で呼び出すことができます。

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

これはC#で可能ですか?

4

4 に答える 4

44

コンパイラに特定のデリゲート型を伝える必要があります。たとえば、ラムダ式をキャストできます。

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

または、 Func オブジェクトを使用する必要があります。

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