【问题标题】:Exception : Collection was modified; enumeration operation may not execute, thrown while clone()例外:集合已修改;枚举操作可能无法执行,在 clone() 时抛出
【发布时间】:2015-12-08 18:39:01
【问题描述】:

我正在尝试编写一个信息提供程序类。我想通过Clone() 提供深拷贝。所以我尝试的是:

public MyInfoClass Clone()
{
     MyInfoClass temp = (MyInfoClass)this.MemberwiseClone();
     foreach (MySystem sys in _mySystems)
     {
         temp.AddSys(sys);
     }
     return temp;
}

集合如下。每当集合至少有一个对象时,它就会抛出异常:

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

private ObservableCollection<MySystem> _mySystems;

public ObservableCollection<MySystem> MySystems
{
    get{ return _mySystems; }
}

我尝试调试并观察到temp.AddSys(sys) 成功执行,但在下一步引发异常。你能帮忙吗?

【问题讨论】:

  • 我看不到 MySystems 的使用位置。但是,似乎在某个地方,您正在枚举一个集合并尝试在这样做的同时更改该集合!像 foreach(var item in items) { items.Remove(someItem); }
  • 旁注 - MemberwiseClone 用于浅拷贝,而不是深拷贝。如果你想要深度克隆,请参阅this

标签: c# .net clone observablecollection


【解决方案1】:

this.MemberwiseClone() 制作成员的浅表副本,对于引用类型,两个对象具有相同的引用,因此您实际上是在枚举和修改同一个集合。您需要创建一个新集合并将项目添加到其中。

 MyInfoClass temp = (MyInfoClass)this.MemberwiseClone();
 temp._mySystems = new ObservableCollection<MySystems>();

 foreach (MySystem sys in _mySystems)
 {
     temp.AddSys(sys);
 }

 return temp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多