访问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表达式之外进行修改。
在这里查看问题以获得一些解释。