访问Lambda表达式中的Modified Closure

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表达式中使用的引用中收到了关于"访问修改后的闭包"的警告.

问题:在这种情况下是否有任何后果的警告?

Jar*_*Par 6

这里的警告是因为您正在访问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)