VB.net中的后期绑定错误

时间:2018-02-24 02:56:02

标签: .net vb.net visual-studio-2017

当我尝试更改Structs的ArrayList中的一个值时,我收到了一个后期绑定错误。当我尝试更改SetDistance()成员中的Distance值时。请告诉我如何成功更改此值。非常感谢。

Public Class ClientClass
    Private Structure Client
        Public Address As String
        Public Distance As Double
    End Structure

    Private ClientList As ArrayList 

    Public Sub New()
        ClientList = New ArrayList
    End Sub

    Public Sub Add(Address As String)
        Dim NewClient As Client
        NewClient.Address = Address
        NewClient.Distance = 0.0
        ClientList.Add(NewClient)
    End Sub

    Public Sub SetDistance(Address As String, Distance As Double)
        Dim Index As Integer = GetIndexOf(Address)
        If Index <> -1 Then ClientList(Index).Distance = Distance 'ERROR
    End Sub

    Public Function GetIndexOf(Address As String) As Integer
        If ClientList.Count = 0 Then Return -1
        Dim Index As Integer
        For Index = 0 To ClientList.Count - 1
            If ClientList(Index).Address = Address Then Return Index
        Next
        Return -1
    End Function
End Class

1 个答案:

答案 0 :(得分:0)

第一个问题是您使用的是ArrayList。别。自.NET 2.0以及List(Of T)类的引入以来,它们已经过时了。如果您想要一组Client值,请使用List(Of Client)。然后Item属性将返回Client值而不是Object引用。 Object类没有Distance属性,因此是后期绑定问题。

但这只会突出另一个问题。这不起作用:

ClientList(Index).Distance = Distance

即使ClientListList(Of Client)。那是因为Client是一个值类型,因此ClientList(Index)将返回集合中值的COPY,而不是实际值。该代码将修改副本,然后立即丢弃它,因此在执行此操作时不会执行任何有用的操作。出于这个原因,它甚至不被允许。您需要做的是获取副本,将其分配给变量,进行更改,然后将副本推回到集合中:

Dim client = ClientList(Index)
client.Distance = Distance
ClientList(Index) = client

问题是,如果你允许编辑属性,那么你真的应该使用类而不是结构。您不必遵循此规则,但最好使结构不可变,即一旦创建就无法修改。