访问 lambda 表达式中的修改闭包
本文关键字:修改 闭包 lambda 表达式 访问 | 更新日期: 2023-09-27 18:23:36
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 表达式外部进行修改。
看看这里的问题以获得一些解释。