如何为VB.NET中的List中的结构元素赋值?

时间:2011-08-19 19:15:56

标签: vb.net data-structures

我在列表中有一个用户定义的结构,我试图在结构列表中的单个元素中更改值。访问元素不是问题。但是,当我尝试更新该值时,编译器会抱怨:

  

“表达式是一个值,因此不能成为目标   分配“

例如:

Public Structure Person

    Dim first as String
    Dim last as String
    Dim age as Integer

End Structure

_

Public Sub ListTest()

    Dim newPerson as Person

    Dim records as List (Of Person)
    records = new List (Of Person)

    person.first = "Yogi"
    person.last = "bear"
    person.age = 35

    records.Add(person)
    records(0).first = "Papa"  ' <<== Causes the error
End Sub

3 个答案:

答案 0 :(得分:15)

正如其他注释所说,当你引用记录(0)时,你得到结构的副本,因为它是一个值类型。你可以做什么(如果你不能把它改成一个类)是这样的:

Dim p As Person = records(0)
p.first = "Papa"
records(0) = p

虽然,我认为使用Class更容易。

答案 1 :(得分:4)

实际上要记住两个重要概念。

正如汉斯和Chris指出的那样,Structure Person声明值类型,其中副本在方法调用之间传递

但您仍然可以访问(即,获取设置)值类型的成员。毕竟,有效:

Dim people(0) As Person
people(0).first = "Yogi"
people(0).last = "Bear"
people(0).age = 35

因此其他重要的一点是,records(0)访问List(Of Person)类的特殊Item 属性,这是一个围绕两个方法调用(getter和setter)的含糖包装器。 直接阵列访问;如果是(例如,如果records是一个数组),你的原始代码实际上会有效。

答案 2 :(得分:1)

我遇到了同样的问题,我通过在更改属性值的结构中添加一个简单的Sub来修复它。

Public Structure Person

 Dim first as String
 Dim last as String
 Dim age as Integer

 Public Sub ChangeFirst(value as String)
  me.first = value
 End Sub

End Structure