假设我有这个功能:
Func<string> fs = () => "test";
var st = fs();
我想将其简化为:
var st = (()=> "test")();
然而,我似乎无法定义该函数然后立即调用它。这可能以另一种方式吗?
这个有可能:
var st = (new Func<string>(() => "test"))();
但是很乱。
为了澄清是否可以定义匿名函数而不必指定正在使用的委托类型,即有没有办法让编译器直接从函数推断类型?
您需要以某种方式指定类型。其他人已经展示了如何内联执行此操作。
还有另一种可能:创建一个辅助方法。因为定义了方法的参数,所以调用方法的时候就不用自己定义类型了。
static class Execute
{
public static T Func<T>(Func<T> func)
{
return func();
}
}
用法:
var st = Execute.Func(() => "test");
只需将表达式转换为正确的类型,如下所示:
var st = ((Func<string>) (() => "test"))();
基本上编译器不知道它是表达式树还是匿名方法。你想要后者,你必须在某个地方指定一个类型。
如果您不想内联转换 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"));
}