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

基本上编译器不知道它是表达式树还是匿名方法。你想要后者,你必须在某个地方指定一个类型。

如果您不想内联转换 lambda,则应使用辅助方法:

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 回答