1

我知道这个例外已经解决了十亿次,但我的情况略有不同(我认为)。

无论如何,我正在使用 ProtoBuf - Net 来保存和加载对象。我有一个我试图反序列化的对象列表,但它一直在说(它来了):

Collection was modified; enumeration operation may not execute.

再一次,我在这里看到这个问题被问了 50 次,所以我很抱歉 50 次,但这里是代码:

public void Load(){
            using (var file = 
                File.Exists(Application.StartupPath + @"\TestFile.scn") ? 
                File.OpenRead("TestFile.scn") : 
                null){
                if (file != null){
                    this._tlpGrid.Controls.Clear();
                    this.Scenes = Serializer.Deserialize<List<GraphicsPanel>>(file);
                    foreach(GraphicsPanel gp in this._lgpScenes)
                        this.AddScene(gp);
                }
            }
}

为什么它会抛出那个异常,如果我做错了,那么正确的方法是什么?

编辑:有人告诉我 AddScene 方法正在修改列表。没错:原文:

    public void AddScene(GraphicsPanel Scene){
        this._tlpGrid.Controls.Add(Scene);
        this.Scenes.Add(Scene);
    }

修改的:

    public void AddScene(GraphicsPanel Scene){
        this._tlpGrid.Controls.Add(Scene);
        if (!this.Scenes.Contains(Scene))
            this.Scenes.Add(Scene);
    }

问题已得到解答,非常感谢。

4

1 回答 1

1

很明显,问题是我调用来修改列表的方法是在迭代列表时修改列表。这应该很明显,但我完全错过了。谢谢你告诉我,李。抛出异常的方法代码:

public void Load(){
            using (var file = 
                File.Exists(Application.StartupPath + @"\TestFile.scn") ? 
                File.OpenRead("TestFile.scn") : 
                null){
                if (file != null){
                    this._tlpGrid.Controls.Clear();
                    this.Scenes = Serializer.Deserialize<List<GraphicsPanel>>(file);
                    foreach(GraphicsPanel gp in this._lgpScenes)
                        this.AddScene(gp);
                }
            }
}

以及导致问题的方法(之前):

public void AddScene(GraphicsPanel Scene){
    this._tlpGrid.Controls.Add(Scene);
    this.Scenes.Add(Scene);
}

之后:

public void AddScene(GraphicsPanel Scene){
    this._tlpGrid.Controls.Add(Scene);
    if (!this.Scenes.Contains(Scene))
        this.Scenes.Add(Scene);
}

再次感谢您耐心地指出显而易见的事情。

于 2013-07-23T16:17:09.287 回答