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

时间:2014-09-11 21:16:13

标签: c# linq foreach resharper query-expressions

如下面的评论,请参阅以下设置代码:

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是不是在查询表达式语法中遇到了这个问题?

1 个答案:

答案 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更改之前没有做过类似的事情,那么你真的不知道它会在寻找什么。