代码之家  ›  专栏  ›  技术社区  ›  Kasper van den Berg

在不创建委托的情况下调用lambda;导致需要cs0149方法名

  •  3
  • Kasper van den Berg  · 技术社区  · 7 年前

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

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

    这会产生错误:

    需要cs0149方法名

    有两种解决方法:

    • 声明(本地)方法:

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

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

    可以创建并立即调用lambda表达式,而不创建委托,也不命名它?如果可能的话,我们怎么能创造出这样的羔羊呢?


    1。 实际上它是 async Task 我想用它代替 Task.ContinueWith (我试着跟随 Stephen Cleary 说: you should strive to replace ContinueWith with await );例如:

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jon Skeet    7 年前

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

    编译器在委托类型方面不受欢迎:而 能够 “知道”关于 Func<T> 并将其用作没有参数的lambda表达式的默认委托类型。

    最接近你想要的是有一个方便的方法,你可以调用它来接受 函数<t> ,这可能只是 返回 函数,或执行它并返回结果。例如:

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

    那么你可以称之为:

    CreateFunc(() => 42)();
    

    ExecuteFunc(() => 42);