为什么Resharper将此标记为"访问修改后的封闭"?

时间:2016-09-18 15:58:38

标签: c# resharper

对不起,如果这是一个重复的问题。我在这里看到很多关于"修改封闭"的问题,但似乎都没有解决我所看到的问题。

Resharper 2016.2标志着我使用" b"和" i1"在lambda表达式中作为"访问修改后的闭包"。我认为不应该。我从不在程序中的任何其他地方使用b或i或i1。两者都在循环中声明 - 实际上,i1是由Resharper创建的,用i来解决修改后的闭包问题。我可以尝试用i1解决它,它只会创建一个" int i2 = i1"并且还在i2上给我警告!当然这是不对的。我在这里缺少什么?

for (int i = 0; i < 10; ++i) {
    Button b = new Button();
    int i1 = i;
    Invoker.SyncInvoke(b, () => { b.Text = "number " + i1; });
}

编辑: 这必须是一个错误。在某个源文件中的某一点(准确地说是第424行)是这三行:

        var collapsed = daSheet;
        int numrows = collapsed.GetLastNonEmptyRow(NonEmptyItemFlag.Data);
        int numcols = collapsed.GetLastNonEmptyColumn(NonEmptyItemFlag.Data);

如果我在这些行之前粘贴上面的代码片段(上面的for循环),我没有得到任何警告。如果我在这些行之后粘贴它,我会收到关于&#34; b&#34;和&#34; i1&#34;。如果我将它粘贴在第2行和第3行之间,我会收到关于&#34; i1&#34;的警告,但不是b。这毫无意义。

1 个答案:

答案 0 :(得分:0)

“他们的一些分析仪的误报率非常糟糕” - 你的确是对的^^

事实上,Resharper并没有错。

想象一下,而不是Invoker ......你会像这样使用任务.Startnew(...) 我假设(仅阅读源代码)在执行后你没有10个不同的按钮,你只有一个,而且这个按钮的文字是“9号”。

因为编译器将lambda表达式中的按钮和i1参数放在一起,所以通常用dotpeek来查看反编译的源代码是值得的。 ?