Как вы присваиваете значения элементам структуры в списке в VB.NET? - PullRequest
19 голосов
/ 19 августа 2011

У меня есть определенная пользователем структура в списке, для которой я пытаюсь изменить значение в отдельном элементе в списке структур.Доступ к элементу не является проблемой.Однако, когда я пытаюсь обновить значение, компилятор жалуется:

"Выражение является значением и, следовательно, не может быть целью назначения"

Например:

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 ]

15 голосов
/ 20 августа 2011

Как говорилось в других комментариях, когда вы ссылаетесь на records (0), вы получаете копию структуры, так как это тип значения. То, что вы можете сделать (если вы не можете изменить его на класс), примерно так:

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

Хотя, я думаю, что использовать класс просто проще.

4 голосов
/ 20 августа 2011

Здесь на самом деле два важных понятия, которые нужно запомнить здесь.

Во-первых, как указывали Ганс и Крис , Structure Person объявляет тип значения из которых копии передаются между вызовами метода.

Вы все еще можете получить доступ (т.е. получить и set) к членам типа значения, хоть.В конце концов, это работает:

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

Таким образом, другой важный момент, который нужно осознать, заключается в том, что records(0) обращается к специальному List(Of Person) классу Item свойство , которое является сладкой оберткой вокруг двух вызовов метода (геттер и сеттер).Это не прямой доступ к массиву;если бы это было (т. е. если бы records был массивом), ваш исходный код действительно работал бы.

1 голос
/ 29 марта 2015

У меня была такая же проблема, и я исправил ее, добавив простой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...