如下面的评论,请参阅以下设置代码:
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下显示警告:
&#34;在关闭时访问foreach变量。使用不同版本的编译器编译时可能会有不同的行为。&#34;
但是如果我将上面的代码(使用ReSsharper)转换为以下查询表达式:
from parentItem in parentItems
let childItems = allItems.Where(c => c.ParentId == parentItem.Id)
...
我没有收到警告。
这种语法(看似等于foreach语法)是否没有相同的闭包警告/问题?
或者ReSharper是不是在查询表达式语法中遇到了这个问题?
答案 0 :(得分:0)
在您的代码中:
foreach (var parentItem in parentItems)
{
var childItems = allItems.Where(c => c.ParentId == parentItem.Id);
...
}
childItem
只是一个查询。它实际上还没有通过allItems
来寻找parentItem.Id
。当您说childItems.ToList();
或childItems.FirstOrDefault()
或类似内容时,就会发生这种情况。
现在,如果你在parentItem
更改之前没有做过类似的事情,那么你真的不知道它会在寻找什么。