3

好的,我知道我不允许修改我当前正在遍历的集合,但请查看下面的代码,您会看到我什至没有触及执行枚举的集合:

    MenuItemCollection tempItems = new MenuItemCollection();
    foreach (MenuItem item in mainMenu.Items)
    {
        if (item.Value != "pen")
            tempItems.Add(item);
    }

如您所见,我添加项目的集合与我正在迭代的集合不同。但我仍然得到错误:

“集合已修改;枚举操作可能无法执行”。

但是,如果我对代码稍作更改并将 MenuItemCollection 替换为 List,它可以工作:

    List<MenuItem> tempItems = new List<MenuItem>();
    foreach (MenuItem item in mainMenu.Items)
    {
        if (item.Value != "pen")
            tempItems.Add(item);
    }

有人可以解释一下为什么吗?

4

1 回答 1

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
}

顺便说一句,这对于 ASP.NET 和 WinForms 都是如此。对于 WinForms 代码会略有不同。

于 2012-10-31T06:25:33.330 回答