2011-08-19 23 views
14

Tengo una estructura definida por el usuario en una lista que estoy tratando de cambiar el valor de un elemento individual dentro de la lista de estructuras. El acceso al elemento no es un problema. Sin embargo, cuando trato de actualizar el valor, el compilador se queja:¿Cómo se asignan valores a elementos de estructura en una lista en VB.NET?

"expresión es un valor y por lo tanto no puede ser el objetivo de la cesión"

Por ejemplo:

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 
+9

Cada programador de .NET comete este error una vez. Una estructura es un tipo de valor, registros (0) devuelve una * copia *. La actualización del "primer" miembro de la copia no logra nada. La persona debe ser una clase. –

+0

Supuestos de arrastre de Darn de C++;). Gracias por el consejo. –

+0

@Hans: sí, es fácil olvidar que incluso 'records (0)' devolverá una copia de la estructura ... – IAbstract

Respuesta

13

Como los otros comentarios s Ayuda, cuando te refieres a los registros (0), obtienes una copia de la estructura ya que es un tipo de valor. Lo que puede hacer (si no se puede cambiar a una clase) es algo como esto:

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

Aunque, creo que es más fácil de usar una clase.

+0

Acabo de toparme con este problema porque tenía un diccionario cuyo valor era una estructura en lugar de una clase. Gracias por la simple solución !! – DontFretBrett

+0

El problema con esto es que copia la estructura completa en lugar de solo el puntero a ella. Es por eso que debes copiarlo. Doble golpe. Mucho sobrecarga. – Brain2000

+0

@ Brain2000: de acuerdo, pero cuando se usan tipos de valores, no tiene muchas opciones. 'Persona' debería haber sido una clase no solo por esta razón, sino también porque las estructuras mutables se desaconsejan. –

4

En realidad, hay dos conceptos importantes para recordar aquí.

Una de ellas es que, como Hans y Chris han señalado, Structure Person declara un valor de tipo de los cuales se pasan copias entre llamadas a métodos.

Aún así puede acceder (es decir, obtener y establecer) los miembros de un tipo de valor, sin embargo. Después de todo, esta obras:

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

Así que la otra punto importante es darse cuenta de que records(0) accesos especial Itemla propiedad de la clase List(Of Person), que es un envoltorio azucarado en torno a dos llamadas al método (un getter y setter). Es no un acceso directo a la matriz; si lo fuera (es decir, si records fuera una matriz), su código original realmente habría funcionado.

1

Tuve el mismo problema, y ​​lo solucioné agregando un Sub simple a la estructura que cambia el valor de la propiedad.

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 
Cuestiones relacionadas