我有一个父类:CMove
我有一堆继承CMove的子类:M [移动名称]
我有一本字典:pMoveSet(Stings,CMove)
字典的值是新的子类:例如pMoveSet(Key1,New MTackle)
我想将实例从字典设置为一个包含子类实例的数组(作为CMove):PossMoves(i)= kvp.Value
我在字典中的“For Each”循环中执行此操作,我在其中检查键以查看是否需要该值。如果我想要该值,我将kvp的值设置为等于数组的元素。
我有一个msgbox,可以在将子对象添加到数组后直接正确显示数组位置和子对象的名称。
我的代码离开循环,我想数组应该包含我想要的CMove的所有相关子类。
与“For Each”循环中的msgbox相同的msgbox崩溃,错误“NullReferenceException未处理。对象引用未设置为对象的实例。“
在循环外再次调用数组时,似乎最初在“For Each”循环中创建并应用于数组的实例会丢失。
我该如何解决这个问题?我很欣赏如何处理这个问题。代码如下。
Dim PossMoves() As CMove, kvp As KeyValuePair(Of String, CMove)
ReDim PossMoves(0)
For Each kvp In pMoveSet
If Val(kvp.Key) < pLvl Then
PossMoves(UBound(PossMoves)) = kvp.Value
MsgBox(UBound(PossMoves) & vbCrLf & PossMoves(UBound(PossMoves)).Name)
ReDim PossMoves(UBound(PossMoves) + 1) 'Will add unused element after the last possible move
End If
Next
ReDim Preserve PossMoves(UBound(PossMoves) - 1) 'Removes blank value at the top of array
MsgBox(UBound(PossMoves) & vbCrLf & PossMoves(UBound(PossMoves)).Name) 'Error on this line.
答案 0 :(得分:1)
问题是您在调整数组大小时没有保留数组。因此,每次调整大小以向阵列添加新元素时,它都会清除该数组。要修复它,只需更改:
ReDim PossMoves(UBound(PossMoves) + 1)
要:
ReDim Preserve PossMoves(UBound(PossMoves) + 1)
但是,我强烈建议您使用List(Of CMove)而不是数组。使用起来更容易,也更有效:
Dim PossMoves As New List(Of CMove)()
For Each kvp As KeyValuePair(Of String, CMove) In pMoveSet
If Integer.Parse(kvp.Key) < pLvl Then
PossMoves.Add(kvp.Value)
End If
Next