【问题标题】:Invoke a lambda without creating a delegate; causes CS0149 Method name expected在不创建委托的情况下调用 lambda;导致 CS0149 方法名称预期
【发布时间】:2018-05-31 08:33:39
【问题描述】:

我想创建一个 lambda 表达式并立即调用它,我想避免创建委托;一个简单的例子1

int i = (() => 42)();

这会产生错误:

CS0149 需要方法名称

有两种解决方法:

  • 声明一个(本地)方法:

    int Return42() => 42;
    
    int i = Return42();
    
  • 创建委托:

    int i = ((Func<int>)(() => 42))();
    

是否可以在不创建委托且不命名委托的情况下创建并立即调用 lambda 表达式?如果可能的话,如何创建这样的 lambda?


1.实际上,我想使用async Task 而不是Task.ContinueWith(我试图按照Stephen Cleary 所说的:@987654323 @);例如:

Task<int> future = (async () =>
                       (await RetrieveLookupFromFarAway())["42"].First())();

RetrieveLookupFromFarAway 类似:

async Task<ILookup<string, int>> RetrieveLookupFromFarAway()
{
    await Task.Delay(1000);
    return Enumerable.Empty<int>().ToLookup((x) => x.ToString());
}

【问题讨论】:

  • 问题是() =&gt; 42 可以同时是FuncExpression。这就是您不能使用 var 将其分配给变量的原因。
  • @HimBromBeere:或者完全不同的委托类型。

标签: c# lambda


【解决方案1】:

lambda 表达式的概念仅作为源代码存在。它本身甚至没有类型(就像null 文字没有类型一样)。它必须转换为表达式树或委托:就 IL 和 CLR 而言,这就是存在的。编译器必须发出代码来创建 something,并且您需要告诉它您希望它是哪种类型。

编译器在委托类型方面并不喜欢:虽然它可以“了解”Func&lt;T&gt; 并将其用作不带参数的 lambda 表达式的默认委托类型,但它没有。

最接近你想要的方法是有一个方便的方法,你可以调用它来接受Func&lt;T&gt;,它可以只是返回函数,或者执行它并返回结果。例如:

public static Func<T> CreateFunc<T>(Func<T> func) => func;
public static T ExecuteFunc<T>(Func<T> func) => func();

那么你可以这样称呼它:

CreateFunc(() => 42)();

ExecuteFunc(() => 42);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多