Как вы присваиваете значения элементам структуры в списке в 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