foreach(var category in categories) {
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}
代码可以正常运行,但是我收到了一个关于"访问已修改的闭包"的警告,这是针对在lambda表达式中使用的
category
的。问题:在这种情况下,这个警告是否有任何影响?
foreach(var category in categories) {
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}
category
的。Where
lambda的闭包内访问变量category
。每次迭代时,category
的值都会更改,Where
延迟执行,因此它将看到当前category
的值,而不是lambda创建时的值。Where
被延迟执行,AddRange
方法也很快,并且将强制评估Where
以完成。因此,Where
方法将看到它期望的category
的值。foreach(var category in categories) {
var localCategory = category;
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(localCategory)));
}
category
在技术上是在循环外面,就像这个伪代码int i; for (i <= 10) { i++; }
?如果是这样的话,我理解 - Where
可能会在category
更改后进行评估?我的理解正确吗? - one.beat.consumer