代码混乱 - 为什么一个有效,而另一个无效?

Code confusion - why does one work, but not the other?

注意:这已经可以正常工作了,但我试图理解为什么它以这种方式工作,而不是其他方式。

我有一个带有动态放置图像的 WinForm (C#),如下所示:

现在,如果您单击 'Napred' 按钮,这些图像应该被删除(除其他外),我最初使用的是:

foreach(Control ctrl in Controls)
    if(ctrl is PictureBox) ctrl.Dispose();

for(int i = 0; i < Controls.Count; i++)
    if(Controls[i] is PictureBox) Controls[i].Dispose();

现在如果我 运行 这个,我得到:

但如果我只是将 for 语句更改为向后发送,它 有效 ?

for(int i = Controls.Count - 1; i >= 0; i--)
    if(Controls[i] is PictureBox) Controls[i].Dispose();

(我不打算再上传一张图片,但它会删除所有元素(最后我只剩下按钮))

有人能告诉我为什么 一个有效,但 另一个 不行吗?

编辑: 我在 Windows 10 上使用 VS2015 社区版,如果它是调试错误(?)

您正在尝试更改您正在迭代的列表,这当然会更改此列表的索引,因此索引 1 的内容现在位于索引 0。

通过从数组末尾移除(即在你的反向),之前的索引将始终相同。

如 Matthew Watson 的评论所述,同样重要的是要注意:

Control.Dispose() is special and will remove the control from a parent container's Controls list.

这不是大多数 Dispose 方法的默认行为,因此您在使用 Dispose

时不会总是发现这种行为