VB.NET For-Each循环错误

时间:2011-01-20 18:26:48

标签: vb.net for-loop each invalidoperationexception

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

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

调试器突出显示 Next 部分,并从错误的MSDN page开始,看起来这是因为集合( 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 个答案:

答案 0 :(得分:2)

不,他们不应该这样做。在迭代它时,你不能修改一个集合,基本上 - 看起来就是这就是发生了什么。

来自List<T>.GetEnumerator()文档:

  

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

您尚未显示AddMap方法的作用,但我怀疑它会向CurrentMaps添加一个地图,从而使迭代器无效。

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

答案 1 :(得分:0)

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

第二种只使用count + index模式。如果边界保持正确,则在使用此模式枚举时改变集合是合法的。

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

答案 2 :(得分:0)

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

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

感谢您的输入,全部!

答案 3 :(得分:0)

Private Maps as list(of MapInfo)

For each iMaps as MapInfo in CurrentMaps

  Maps.add(iMaps)

Next