为什么*没有*ReSharper告诉我"隐式捕获关闭"?

dlf*_*dlf 5 c# resharper lambda closures resharper-9.2

这个问题及其答案很好地解释了隐式捕获闭包的概念.但是,我偶尔会看到代码似乎应该生成有问题的警告,实际上并没有.例如:

public static void F()
{
  var rnd1 = new Random();
  var rnd2 = new Random();
  Action a1 = () => G(rnd1);
  Action a2 = () => G(rnd2);
}

private static void G(Random r)
{
}
Run Code Online (Sandbox Code Playgroud)

我的期望是,我会被警告,a1隐含地捕获rnd2,并a2隐含地捕获rnd1.但是,我根本没有得到任何警告(链接问题中的代码确实为我生成了它).这是ReSharper的一个错误(v9.2),还是由于某种原因不会在这里发生隐式捕获?

Evk*_*Evk 4

我认为 Resharper 由于某种原因无法发现这种情况下隐式捕获的变量。您可以使用一些反汇编程序来验证编译器是否生成带有 rnd1 和 rnd2 的单个类。您的示例还不清楚,但让我们以 Eric Lippert 博客文章中的示例为例(https://blogs.msdn.microsoft.com/ericlippert/2007/06/06/fyi-c-and-vb-closures-are -per-scope/),他描述了一个危险的隐式捕获的示例:

Func<Cheap> M() {            
    var c = new Cheap();
    var e = new Expensive();
    Func<Expensive> shortlived = () => e;
    Func<Cheap> longlived = () => c;            
    shortlived();
    // use shortlived
    // use longlived
    return longlived;
}

class Cheap {

}

class Expensive {

}
Run Code Online (Sandbox Code Playgroud)

在这里很明显,长寿的委托捕获了昂贵的变量,并且在它死亡之前不会被收集。但是(至少对我来说),Resharper 不会警告你这一点。虽然不能将其命名为“bug”,但肯定有改进的地方。