我有以下代码:
foreach (var parent in parents)
{
var children = data.Find<Order>(x=>x.ParentOrderId==parent.OrderId).ToList();
// Do stuff with the children variable
}
Resharper 告诉我,我在父变量上有一个 Access to Modified 闭包问题。但是调用 ToList() 不是意味着它会立即被评估吗?
这是否否定了这样做的必要性?
foreach (var parent in parents)
{
var parentClosure = parent;
var children = data.Find<Order>(x=>x.ParentOrderId==parentClosure.OrderId).ToList();
// Do stuff with the children variable
}
最佳答案
这就是为什么“访问修改后的闭包”只是一个警告,而不是一个错误。基本上,只要该闭包(对它的任何引用)无法逃脱循环体的一次迭代,就可以了。
因为,正如您提到的,.ToList()
评估持有闭包的 IEnumerable,你没问题,这个警告确实是无害的,你可以安全地通过评论禁止它。
为了让 ReSharper 知道此警告何时严重,它不仅必须对闭包执行逃逸分析,还必须知道 Find<T>
是如何发生的。和 .ToList()
保持闭包的行为。这可能不会很快发生。
关于c# - ToList() 删除是否需要解决 "Access to Modified Closure"resharper 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8329649/