在不创建委托的情况下调用lambda;导致CS0149预期的方法名称

时间:2018-05-31 08:33:39

标签: c# lambda

我想创建一个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}}

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);