我想创建一个lambda表达式并立即调用它,我想避免创建一个委托;一个简单的例子 1 :
int i = (() => 42)();
这会产生错误:
CS0149预期的方法名称
有两种解决方法:
声明一个(本地)方法:
int Return42() => 42;
int i = Return42();
创建委托:
int i = ((Func<int>)(() => 42))();
可以创建并立即调用lambda表达式而无需创建委托并且无需命名吗?如果可能的话,怎么能创造出这样的lambda?
1。 实际上,我想使用async
Task
代替Task.ContinueWith
(我试图遵循Task<int> future = (async () =>
(await RetrieveLookupFromFarAway())["42"].First())();
{3}}说:Stephen Cleary); e.g:子>
RetrieveLookupFromFarAway
使用async Task<ILookup<string, int>> RetrieveLookupFromFarAway()
{
await Task.Delay(1000);
return Enumerable.Empty<int>().ToLookup((x) => x.ToString());
}
之类的内容:
{{1}}
答案 0 :(得分:2)
lambda表达式的概念仅作为源代码存在。它本身甚至没有类型(就像null
文字没有类型一样)。 将转换为表达式树或委托:就IL和CLR而言,这就是存在的东西。编译器必须发出代码来创建某些东西,你需要告诉它你想要的类型。
编译器不会在委托类型方面播放收藏夹:虽然可以“知道”Func<T>
并将其用作没有参数的lambda表达式的默认委托类型,它没有。
你最接近你想要的是有一个方便的方法,你可以称之为接受Func<T>
,它可以只是返回该功能,或执行它返回结果。例如:
public static Func<T> CreateFunc<T>(Func<T> func) => func;
public static T ExecuteFunc<T>(Func<T> func) => func();
然后你可以把它称为:
CreateFunc(() => 42)();
或
ExecuteFunc(() => 42);