【问题标题】:VB.NET "Object reference not set to an instance of an object." when trying to ReDim array inside of arrayVB.NET“对象引用未设置为对象的实例。”尝试在数组内重新调整数组时
【发布时间】:2017-05-09 15:27:07
【问题描述】:

我正在尝试在此处重新调整这一行中的一组类:

    For i As Integer = 0 To RacerList(i).CompatibilityArr.Count - 1
        For o As Integer = 0 To RacerList(i).CompatibilityArr.Count - 1
            ReDim Preserve RacerList(i).CompatibilityArr(o).HeightCompArr(AmountOfRacers - 1)
        Next
    Next

Redim 代码行导致“对象引用未设置为对象的实例。”

在这行代码之上,我有:

    For i As Integer = 0 To RacerList.Count - 1
        ReDim Preserve RacerList(i).CompatibilityArr(AmountOfRacers - 1)
    Next

哪个工作得很好,所以我很确定错误出现在 HeightCompArr 中(另外,当我写“HeightCompArr.”时,它不会在下拉菜单中暗示其中的孩子菜单)

以下是单独模块形式的所有类/结构/数组:

Public RacerList As New List(Of Racer)

<Serializable()> Public Class Racer
    Public Property Name As String
    Public Property CleatSize As String
    Public Property SkillLevel As String
    Public Property Height As String
    Public Property Team As String
    Public CompatibilityArr() As Compatibility
End Class

<Serializable()> Public Class Compatibility
    Public HeightCompArr() As HeightComp
End Class

<Serializable()> Public Class HeightComp
    Public Name As String
    Public Score As Integer
End Class

我不确定这是否是我在数组中包含数组的方式或什么问题。我非常感谢任何建议。

【问题讨论】:

  • 我无法实施其他问题的解决方案来解决我的问题 -- 这可能是由于实施不正确或解决方案不适用,我不确定
  • 肯的回答很可能是正确的。您已设置“CompatibilityArr”的大小,但其中不包含“Compatibility”的实例;因此当您尝试访问内部的“HeightCompArr”时出现错误。您需要遍历“CompatibilityArr”的每个索引并为其分配一个实例:CompatibilityArr(i) = New Compatibility()
  • 有什么理由不使用List(Of T)

标签: arrays vb.net class structure


【解决方案1】:

您有句法错误和设计问题。

正如其他人所指出的,语法问题是,REDIM PRESERVE 只为对象腾出空间,它实际上并没有创建对象。要解决此问题,您需要为数组的每个元素创建一个新对象。

您遇到的设计问题是您试图将每个赛车手与其他所有赛车手进行比较,但您将比较结果存储在 Racer 类中。 Racer 引用应该在比较中,而不是相反。

我建议您使用 List(Of ...) 而不是数组,并按如下方式进行重组:

Private Sub Main()
  Dim RacerList As New List(Of Racer)
  Dim CompatibilityArr As New List(Of Compatibility)

  Dim Adam As New Racer With {.Name = "Adam", .CleatSize = "10", .SkillLevel = "2", .Height = "180", .Team = "Blue"}
  Dim Bill As New Racer With {.Name = "Bill", .CleatSize = "11", .SkillLevel = "3", .Height = "185", .Team = "Blue"}
  Dim Charlie As New Racer With {.Name = "Charlie", .CleatSize = "12", .SkillLevel = "4", .Height = "190", .Team = "Red"}
  RacerList.Add(Adam)
  RacerList.Add(Bill)
  RacerList.Add(Charlie)
  CompatibilityArr.Add(New Compatibility With {.Racer1 = Adam, .Racer2 = Bill, .HeightCompScore = 5})
  CompatibilityArr.Add(New Compatibility With {.Racer1 = Adam, .Racer2 = Charlie, .HeightCompScore = 6})
  CompatibilityArr.Add(New Compatibility With {.Racer1 = Bill, .Racer2 = Charlie, .HeightCompScore = 7})
End Sub


<Serializable()> Public Class Racer
  Public Property Name As String
  Public Property CleatSize As String
  Public Property SkillLevel As String
  Public Property Height As String
  Public Property Team As String
End Class

<Serializable()> Public Class Compatibility
  Public Racer1 As Racer
  Public Racer2 As Racer
  Public HeightCompScore As Integer
End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2013-01-14
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多