繁体   English   中英

访问闭包中的foreach变量会显示有关编译器的警告,但不会在查询表达式语法中显示警告

[英]Access to foreach variable in closure shows warning about compiler, but doesn't show warning in query expression syntax

对于下面的评论,这里有一些设置代码:

var allItems = new List<Item>();
allItems.Add(new Item{Id = 1});//etc etc
allItems.Add(new Item{Id = 2, ParentId = 1});//etc etc

给定设置代码; 以下代码:

foreach (var parentItem in parentItems)
{
    var childItems = allItems.Where(c => c.ParentId == parentItem.Id);
    ...
}

在parentItem.Id下显示警告:

“访问闭包中的foreach变量。使用不同版本的编译器进行编译时,可能会有不同的行为。”

但是,如果我将上面的代码(使用ReSsharper)转换为以下查询表达式:

from parentItem in parentItems 
let childItems = allItems.Where(c => c.ParentId == parentItem.Id) 
...

我没有得到警告。

这个语法(看似等于foreach语法)是否没有相同的关闭警告/问题?

还是ReSharper不在查询表达式语法中解决这个问题?

在您的代码中:

 foreach (var parentItem in parentItems)
 {
     var childItems = allItems.Where(c => c.ParentId == parentItem.Id);
     ...
 }

childItem只是一个查询。 它实际上并没有遍历allItems寻找parentItem.Id 当您说childItems.ToList();时,就会发生这种情况childItems.ToList(); childItems.FirstOrDefault()或类似的东西。

现在,如果您在parentItem更改之前没有做类似的事情,那么您实际上就不知道它要寻找什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM