Как вы присваиваете значения элементам структуры в списке в VB.NET?
У меня есть определенная пользователем структура в списке, который я пытаюсь изменить значение для отдельного элемента в списке структур. Доступ к элементу не является проблемой. Однако, когда я пытаюсь обновить значение, компилятор жалуется:
"Выражение является значением и, следовательно, не может быть целью Назначение"
Например:
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
Ответы
Ответ 1
Как указывалось в других комментариях, когда вы ссылаетесь на записи (0), вы получаете копию структуры, так как это тип значения. То, что вы можете сделать (если вы не можете изменить его в классе), выглядит примерно так:
Dim p As Person = records(0)
p.first = "Papa"
records(0) = p
Хотя, я считаю, что просто использовать класс.
Ответ 2
На самом деле здесь есть два важных понятия.
Во-первых, как указал Ханс и Крис, 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
- массив), ваш исходный код действительно сработал.
Ответ 3
У меня была та же проблема, и я исправил ее, добавив простой 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