ToList()删除需要解决"访问修改后的关闭"resharper警告吗?

Vac*_*ano 2 .net c# resharper closures

我有以下代码:

foreach (var parent in parents)
{
    var children = data.Find<Order>(x=>x.ParentOrderId==parent.OrderId).ToList();
    // Do stuff with the children variable
}
Run Code Online (Sandbox Code Playgroud)

Resharper告诉我,父变量上有一个Access to Modified closure问题.但是不调用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
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ser 8

这就是为什么"访问修改后的闭包"只是一个警告,而不是一个错误.基本上,只要闭包(对它的任何引用)都无法转义循环体的一次迭代,你就可以了.

因为,正如你所提到的, .ToList()评估持有闭包的IEnumerable,你很好,这个警告确实是无害的,你可以用注释安全地压制它.

为了让ReSharper知道这个警告何时是严重的,它不仅必须对闭合进行逃逸分析,而且还必须知道如何保持闭合的方式Find<T>.ToList()行为.这很可能不会很快发生.