0

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

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 没有在查询表达式语法中发现这个问题?

4

1 回答 1

0

在您的代码中:

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

childItem只是一个查询。它实际上还没有通过allItems查找进行迭代parentItem.Id。当你说childItems.ToList();childItems.FirstOrDefault()类似的东西时,就会发生这种情况。

现在,如果您在更改之前不做类似的事情parentItem,那么您真的不知道它会寻找什么。

于 2014-09-11T21:35:15.987 回答