如果这是一个重复的问题,我很抱歉。在这里我看到了许多关于“修改闭包”的问题,但似乎没有解决我所遇到的问题。
Resharper 2016.2将我的lambda表达式中使用的“b”和“i1”标记为“访问已修改的闭包”。我认为它不应该这样做。我从未在程序的其他地方使用过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; });
}
编辑: 这一定是一个bug。在某个特定的源文件中(确切地说,在第424行),有以下三行:
var collapsed = daSheet;
int numrows = collapsed.GetLastNonEmptyRow(NonEmptyItemFlag.Data);
int numcols = collapsed.GetLastNonEmptyColumn(NonEmptyItemFlag.Data);
如果我将上面的代码片段(即上面的for循环)粘贴到那些行之前,就不会收到警告。如果我将它粘贴在那些行之后,就会收到关于"b"和"i1"的警告。如果我将它粘贴在第二行和第三行之间,我会收到关于"i1"的警告,但不是关于"b"的警告。这毫无意义。
Invoker.SyncInvoke
是多余的;一个按钮被创建并且文本被赋值,但是这个按钮还没有被添加到控件集合中。 - Metro Smurf