【问题标题】:VB.NET For-Each Loop ErrorVB.NET For-Each 循环错误
【发布时间】:2011-01-20 18:26:47
【问题描述】:

在编写一些代码来加载我的应用程序设置时遇到一个问题——以下代码会产生 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。

谢谢大家的意见!

【问题讨论】:

  • AddMap 是做什么的? 有没有碰过CurrentMaps
  • 如果 CurrentMaps 是字典或排序列表,第二个 sn-p 也会失败。一种令人讨厌的无法检测到的故障。

标签: vb.net for-loop each invalidoperationexception


【解决方案1】:

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

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

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

您还没有显示您的 AddMap 方法的作用,但我怀疑它向 CurrentMaps 添加了一个映射,从而使迭代器无效。

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

【讨论】:

  • 是的,但是如果 For Each 调用的 sub 只接收某些内容而不引用原始 (ByVal) 和布尔值,则没有理由更改集合。跨度>
  • @amb9800:好吧,鉴于正在发生的事情,似乎AddMap 正在添加到您正在迭代的同一个集合中。不过,您还没有显示该代码。
  • 如下所示,当再次查看它时,它确实在不经意间修改了 CurrentMaps。谢谢!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    谢谢大家的意见!

    【讨论】:

    • 您应该修改原始问题并将其添加为附加信息,而不是创建新答案。
    【解决方案4】:
    Private Maps as list(of MapInfo)
    
    For each iMaps as MapInfo in CurrentMaps
    
      Maps.add(iMaps)
    
    Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多