在编写一些代码来加载我的应用程序的设置时遇到了一个问题 - 以下代码产生 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。
感谢您的输入,全部!
答案 0 :(得分:2)
不,他们不应该这样做。在迭代它时,你不能修改一个集合,基本上 - 看起来就是这就是发生了什么。
只要集合保持不变,枚举器仍然有效。如果对集合进行了更改,例如添加,修改或删除元素,则枚举数将无法恢复,并且其行为未定义。
您尚未显示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