C#定义Task<IEnumerable<PingReply>>返回值时CS0029错误的修正方法
修正C#中Task<IEnumerable>返回值的编译错误
错误原因
- 异步lambda未返回
PingReply结果:Select中的异步lambda没有返回result,导致tasks被推断为IEnumerable<Task>而非IEnumerable<Task<PingReply>>。Task.WhenAll(tasks)执行后返回无返回值的Task,await后得到void,无法转换为IEnumerable<PingReply>,这是CS0029错误的核心原因。 - 语法错误:
SendPingAsync(ip, 1000)末尾多了一个多余的右括号,会引发额外编译问题。
修正步骤
- 在异步lambda中添加
return result;,让每个异步任务返回对应的PingReply实例,确保tasks类型为IEnumerable<Task<PingReply>>。 - 移除
SendPingAsync调用末尾多余的右括号,修复语法错误。
修正后的完整代码
private async ValueTask PingMachine() { var timesToPing = 4; var counter = 1; while (counter <= timesToPing) { var reply = await Pinger(counter); counter++; } } private async Task<IEnumerable<PingReply>> Pinger(int counter) { List<string> addresses = new List<string>(); if (Check_IP_Correct(TagService.IP_PLC_List)) addresses.Add(TagService.IP_PLC_List); var tasks = addresses.Select(async ip => { var result = await new Ping().SendPingAsync(ip, 1000); TagService.log_PLC.AppendLine($" Pinged {ip} {counter} times time:{result.RoundtripTime} status: {result.Status.ToString()}"); return result; // 添加返回语句 }); return await Task.WhenAll(tasks); }
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

