无法将 void 分配给隐式类型的本地变量

15
var query = rep.GetIp()  // in this line i have the error
           .Where(x => x.CITY == CITY)
           .GroupBy(y => o.Fam)
           .Select(z => new IpDTO
                        {
                            IId = z.Key.Id,
                            IP = z.Select(x => x.IP).Distinct()
                        })
           .ToList().ForEach(IpObj => IpObj.IP.ToList().ForEach(ip => PAINTIP(ip)));

运行这段代码时,我遇到了以下错误:

无法将void分配给隐式类型的局部变量

我搜索了一下并发现这是一个类型问题,因为foreach不是LINQ函数?但我不明白void在哪里!


这是确切的错误信息吗?这是编译时错误吗?具体是哪一行?你能展示更多的代码吗?有很多未显示的引用... - Jan
PAINTIPGetIp是什么,它们的返回类型是什么? - Oded
你是否正在尝试将此查询的结果分配给某个变量? - Pawan Mishra
变量查询 = rep.GetIp() 这是导致错误的那一行。文件是SERVICES.ASMX.CS。 - Tania1990
3个回答

14
  • ForEach() 的类型为 void

  • Select() 返回 IEnumerable<T>ToList() 返回 List<T> 等。

因此:

List<X> x = ...Select(x => x).ToList(); // List<T>
或者
x.ForEach(x => x); // void

因为你无法将 void 赋值给 List<T>


var query = rep.GetIp()  // in this line i have the error
           .Where(x => x.CITY == CITY)
           .GroupBy(y => o.Fam)
           .Select(z => new IpDTO
                        {
                            IId = z.Key.Id,
                            IP = z.Select(x => x.IP).Distinct()
                        });

foreach (var dto in query)
{
    foreach (var ip in dto.IP)
    {
        PAINTIP(ip);
    }
}
或者
var query = ....
           .SelectMany(z => z.Select(x => x.IP).Distinct());

foreach (var ip in query)
{
    PAINTIP(ip);
}

aba,谢谢您的解释,我不确定我是否理解了语法,我需要像您的示例中那样在foreach之前添加IpObj吗?.ToList()IpObj.ForEach(IpObj => IpObj.IP.ToList().ForEach(ip => PAINTIP(ip))); ? - Tania1990
顺便提一下,您可以在注释中使用波浪号来突出显示代码,例如:ToList(); IpObj.ForEach(IpObj => IpObj.IP.ToList().ForEach(ip => PAINTIP(ip))); - abatishchev
@Tania:请详细描述您要实现的内容,例如为每个城镇中的每个IP调用PaintIP()函数? - abatishchev
我需要返回结果"IId"和"IP",并且对于IP内的每个IP元素,调用PAINTIP(ip)。 - Tania1990
你是我的英雄!在你使用ip的两个例子中,你在哪里定义了“ip”? - Tania1990
@Tania1990:我错过了一个示例中的 var ip。请注意,第二个示例中我没有使用类型 IpDTO,而是使用 SelectMany() 选择联合序列中每个 DTO 的 IP。 - abatishchev

7

ForEach()不会返回任何东西。它的类型是void。

尝试用Select()替换您的ForEach()调用。


1

我看到了你的其他问题,其中你为同一查询提出了类似的问题。代码部分如下:

var Q = rep.GetIp()
        .Where(x => x.CITY == CITY)
        .GroupBy(y => o.Fam)
        .Select(z => new IpDTO
        {
          IId = z.Key.Id,
          IP = z.Select(x => x.IP).Distinct()
       });

看起来你已经使用了答案,试图将查询返回的值分配给变量“Q”。请查看您之前的帖子:LINQ IEnumerable<string>中的语法

正如其他人所说,ForEach的返回类型是“void”。在变量“Q”用集合初始化后,应该调用“ForEach”。


我现在明白了,但是如何在Q被初始化后才调用ForEach函数? - Tania1990
@Tania1990,简单来说:var q = …; q.ForEach(…);。但我建议你使用普通的foreach而不是List.ForEach() - svick
svick,请展示一下你如何使用List.ForEach()与我的语法 - 我已经使用了.ToList().ForEach()。 - Tania1990
1
@Tania:你正在扩大原始问题的范围。只有当你完全理解Lambda表达式、系统定义的委托(如Func<>、Action<>等)时,才能编写Linq查询。请参考以下链接了解示例LINQ查询:http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b - Pawan Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接