访问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表达式之外进行修改。
在这里查看问题以获得一些解释。
上述就是C#学习教程:访问Lambda表达式中的Modified Closure分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/952111.html