访问Lambda表达式中的Modified Closure

foreach(var category in categories) { a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category))); } 

代码运行正常,但我在lambda表达式中使用的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))); } 

它告诉您“类别”变量存在于闭包中,可以在LINQ表达式之外进行修改。

在这里查看问题以获得一些解释。