1

私がこの機能を持っていると仮定します:

Func<string> fs = () => "test";
var st = fs();

これを次のように単純化します。

var st = (()=> "test")();

ただし、関数を定義してすぐに呼び出すことはできないようです。これは別の方法で可能ですか?

これは可能です:

var st = (new Func<string>(() => "test"))();

しかし、非常に面倒です。

明確にするために、使用されているデリゲート型を指定せずに匿名関数を定義することは可能ですか。つまり、関数から直接型を推測するコンパイラを取得する方法はありますか?

4

3 に答える 3

4

何らかの方法でタイプを指定する必要があります。他の人は、これをインラインで行う方法を示しています。

別の可能性があります: ヘルパー メソッドを作成します。メソッドのパラメーターが定義されているため、メソッドを呼び出すときに自分で型を定義する必要はありません。

static class Execute
{
    public static T Func<T>(Func<T> func)
    {
        return func();
    }
}

使用法:

var st = Execute.Func(() => "test");
于 2012-12-03T09:08:15.380 に答える
3

次のように、式を正しい型にキャストするだけです。

var st = ((Func<string>) (() => "test"))();
于 2012-12-03T09:04:09.510 に答える
1

基本的に、コンパイラはそれが式ツリーなのか匿名メソッドなのかを知りません。後者が必要な場合は、途中でタイプを指定する必要があります。

ラムダをインラインでキャストしたくない場合は、ヘルパーメソッドを使用する必要があります。

static TResult call<TResult>(Func<TResult> f)
{
    return f();
}
static TResult call<T1, TResult>(Func<T1,TResult> f, T1 arg1)
{
    return f(arg1);
}
static TResult call<T1, T2, TResult>(Func<T1, T2, TResult> f, T1 arg1, T2 arg2)
{
    return f(arg1, arg2);
}
// and so on...

static void Main(string[] args)
{
    Console.WriteLine(call(() => "test"));
}
于 2012-12-03T09:13:22.740 に答える