[英]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.