我在列表中有一个用户定义的结构,我试图在结构列表中的单个元素中更改值。访问元素不是问题。但是,当我尝试更新该值时,编译器会抱怨:
“表达式是一个值,因此不能成为目标 分配“
例如:
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
答案 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