0

编写一些代码以加载我的应用程序设置时遇到问题 - 以下代码会产生InvalidOperationException错误:

For Each c As MapInfo In CurrentMaps
    AddMap(c, False)
Next

调试器突出显示Next部分,从MSDN 页面上的错误来看,这是因为集合(CurrentMaps)与上次碰撞枚举器(以处理For Each)时发生了某种变化。

但是,不确定为什么会发生这种情况,因为AddMap采用MapInfo ByVal 并且不接触输入(因此集合不会更改)。

我把它改成了这个,效果很好:

For i As Integer = 0 To CurrentMaps.Count - 1
    AddMap(CurrentMaps(i), False)
Next

这些在功能上应该是一样的,对吧?知道为什么For Each不起作用吗?

编辑:

啊想通了 - 问题是我使用 CurrentMaps 作为临时变量(收集跟踪当前地图),并且 AddMap 通常在应用程序中用于添加新地图(这意味着更新 UI 并将其添加到 CurrentMaps )。

在这里(加载应用程序时),我只是使用 AddMap 来更新 UI,但是将项目添加到 CurrentMaps 的子调用仍然存在,因此它确实在修改 CurrentMaps。

感谢您的输入,所有!

4

4 回答 4

2

不,它们不应该以同样的方式工作。基本上,在迭代集合时,您无法修改集合 - 看起来这就是正在发生的事情。

List<T>.GetEnumerator()文档:

只要集合保持不变,枚举数就保持有效。如果对集合进行了更改,例如添加、修改或删除元素,则枚举器将不可恢复地失效,并且其行为未定义。

你没有展示你的AddMap方法做了什么,但我怀疑它添加了一个映射到CurrentMaps,从而使迭代器无效。

如果您可以向我们提供有关确切功能的更多信息,我们AddMap可以为您提供更多帮助。是什么False意思?

于 2011-01-20T18:27:45.640 回答
0

不,这些功能的工作方式非常不同。第一个版本使用 .Net IEnumerable(Of T)+IEnumerator(Of T)模式。在使用这种模式枚举集合时改变集合是不合法的。许多 BCL 类型强制执行此要求。

第二个简单地使用计数 + 索引模式。如果边界保持正确,则在使用此模式枚举时改变集合是合法的。

这里的问题几乎可以肯定AddMap是间接地改变了CurrentMaps集合并因此产生了这个错误。

于 2011-01-20T18:28:39.910 回答
0

啊想通了 - 问题是我使用CurrentMaps作为临时变量(收集跟踪当前地图),并且AddMap通常在应用程序中用于添加新地图(这意味着更新 UI 并将其添加到CurrentMaps)。

在这里(加载应用程序时),我只是使用AddMap来更新 UI,但是将项目添加到CurrentMaps的子调用仍然存在,因此它确实在修改CurrentMaps

感谢您的输入,所有!

于 2011-01-20T18:36:27.820 回答
0
Private Maps as list(of MapInfo)

For each iMaps as MapInfo in CurrentMaps

  Maps.add(iMaps)

Next
于 2014-03-12T12:01:37.533 回答