one*_*mer 4 c# linq lambda closures
foreach(var category in categories) {
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}
Run Code Online (Sandbox Code Playgroud)
代码运行正常,但我category在lambda表达式中使用的引用中收到了关于"访问修改后的闭包"的警告.
问题:在这种情况下是否有任何后果的警告?
这里的警告是因为您正在访问lambda category闭包内的变量Where.该值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)));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1945 次 |
| 最近记录: |