gpt4 book ai didi

c# - 在不创建委托(delegate)的情况下调用 lambda;原因 CS0149 需要方法名称

转载 作者:行者123 更新时间:2023-11-30 15:54:24 27 4
gpt4 key购买 nike

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

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

这会产生错误:

CS0149 Method name expected

有两种解决方法:

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

    int Return42() => 42;

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

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

是否可以在不创建委托(delegate)且不命名的情况下创建并立即调用 lambda 表达式?如果可能的话,如何创建这样的 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());
}

最佳答案

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

编译器不偏爱委托(delegate)类型:虽然它可以“知道”Func<T>并将其用作不带参数的 lambda 表达式的默认委托(delegate)类型,但事实并非如此。

最接近您想要的是拥有一个方便的方法,您可以调用它来接受 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);

关于c# - 在不创建委托(delegate)的情况下调用 lambda;原因 CS0149 需要方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com