gpt4 book ai didi

c# - LINQ 选择语句。匿名方法返回异常

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:45 25 4
gpt4 key购买 nike

在 LINQ Select 语句中使用匿名方法时,匿名方法是否必须返回值?

当我执行以下操作时,我没有收到任何错误:

await Task.WhenAll(list.Select(a => doSomething(a)));

但是当我这样做时,我得到一个错误,指出无法从用法中推断出类型参数:

await Task.WhenAll(list.Select(a => {
doSomething(a);
Log("Log Something");
UpdateUI();
}));

为什么第一个有效而第二个无效?

这是 doSomething 方法:

private async Task doSomething(string a)
{
HttpClient client = new HttpClient;
// Do stuff
string source = await client.PostAsync(a, content);
// Extract data from source and store in text file.
}

最佳答案

When using an anonymous method in a LINQ Select statement does the anonymous method have to return a value?

是的。 Select 方法的签名是:

public IEnumerable<TResult> Select<TSource, TResult>(
IEnumerable<TSource> source,
Func<TSource, TResult> selector)

所以选择器必须返回一个值。

对于您的第一个代码片段,返回语句是隐式的。 doSomething 返回一个值,该值是每个项目的投影目标。

当您使用语句 lambda 而不是表达式 lambda 时,没有隐式 return 语句。由于您的第二个代码块未返回任何内容,因此它与 Select 期望的不匹配。

现在,至于你的实际问题。您要做的是将每个任务转换到一个执行某些操作的任务中,然后在完成后写入日志并更新 UI。您可以使用 async lambda 来执行此操作。在 async lambda 中,当没有 return 语句时,它仍然会返回一个 Task(只是没有 Result ) 而不是 void。这正是您想要做的,将每个任务转换到另一个任务中。

await Task.WhenAll(list.Select(async a => {
await doSomething(a);
Log("Log Something");
UpdateUI();
}));

关于c# - LINQ 选择语句。匿名方法返回异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23744148/

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