0

我有一个父类:CMove

我有一堆继承 CMove 的子类: M[Name of Move]

我有一本字典:pMoveSet(of Stings, CMove)

字典的值是新的子类:例如 pMoveSet(Key1, New MTackle)

我想将字典中的实例设置为包含子类实例的数组(作为 CMove):PossMoves(i) = kvp.Value

我在字典上的“For Each”循环中执行此操作,在其中检查键以查看是否需要该值。如果我想要这个值,我将 kvp 的值设置为等于数组的一个元素。

我有一个 msgbox,可以在将子对象添加到数组后直接正确显示数组位置和子对象的名称。

我的代码离开了循环,我想数组应该包含我想要的所有相关的 CMove 子类。

与“For Each”循环中的 msgbox 相同的 msgbox 崩溃,并出现错误“NullReferenceException 未处理。对象引用未设置为对象的实例。”</p>

在循环外再次调用数组时,最初在“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.
4

1 回答 1

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
于 2012-09-26T15:37:16.117 回答