好的,我知道我不允许修改我正在浏览的集合,但是看看下面的代码,你会看到我甚至没有触及枚举执行的集合:
MenuItemCollection tempItems = new MenuItemCollection();
foreach (MenuItem item in mainMenu.Items)
{
if (item.Value != "pen")
tempItems.Add(item);
}
正如您所看到的,我添加项目的集合与我正在迭代的集合不同。但我仍然得到错误:
“集合已被修改;枚举操作可能无法执行”。
但是,如果我对代码稍作更改并将ListItemCollection替换为List,则可以:
List<MenuItem> tempItems = new List<MenuItem>();
foreach (MenuItem item in mainMenu.Items)
{
if (item.Value != "pen")
tempItems.Add(item);
}
有人能解释我为什么吗?
答案 0 :(得分:4)
当您将MenuItem
添加到另一个MenuItemCollection
时,它会从其所有者(mainMenu
)中删除。因此修改了原始集合:
public void Add(MenuItem child)
{
if ((child.Owner != null) && (child.Parent == null))
child.Owner.Items.Remove(child);
if (child.Parent != null)
child.Parent.ChildItems.Remove(child);
if (this._owner != null)
{
child.SetParent(this._owner);
child.SetOwner(this._owner.Owner);
}
// etc
}
BTW 这对于ASP.NET和WinForms都是如此。对于WinForms代码会略有不同。