C# ToList()是否消除了解决“问题”的必要性;进入修改后的关闭窗口”;再竖琴警告?

C# ToList()是否消除了解决“问题”的必要性;进入修改后的关闭窗口”;再竖琴警告?,c#,.net,resharper,closures,C#,.net,Resharper,Closures,我有以下代码: foreach (var parent in parents) { var children = data.Find<Order>(x=>x.ParentOrderId==parent.OrderId).ToList(); // Do stuff with the children variable } foreach(父对象中的变量父对象) { var children=data.Find(x=>x.ParentOrderId==parent

我有以下代码:

foreach (var parent in parents)
{
    var children = data.Find<Order>(x=>x.ParentOrderId==parent.OrderId).ToList();
    // Do stuff with the children variable
}
foreach(父对象中的变量父对象)
{
var children=data.Find(x=>x.ParentOrderId==parent.OrderId.ToList();
//用children变量做一些事情
}
Resharper告诉我,我可以访问父变量上的已修改闭包问题。但是调用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
}
foreach(父对象中的变量父对象)
{
var parentClosure=parent;
var children=data.Find(x=>x.ParentOrderId==parentClosure.OrderId.ToList();
//用children变量做一些事情
}

只有在循环迭代后父变量更改后调用lambda表达式时,才会出现此问题

如果调用
ToList()
,lambda仅在
ToList()调用中使用

如果不调用
ToList()
,则每次枚举LINQ查询时都会使用lambda。

如果以后再也不使用该查询,您就不需要
ToList()

ReSharper无法判断Find没有将lambda存储在全局某个位置以供以后使用,因此它会发出警告。

这正是为什么“访问修改的闭包”只是一个警告,而不是一个错误。基本上,只要闭包(对它的任何引用)不能逃脱循环体的一次迭代,就可以了

正如您所提到的,
.ToList()
对包含闭包的IEnumerable进行求值,因此您很好,而且此警告实际上是无害的,您可以通过注释安全地抑制它

为了让ReSharper知道此警告何时严重,它不仅必须对闭包执行逃逸分析,还必须知道
Find
.ToList()
在保持闭包方面的行为。这可能不会很快发生