2013-08-02 6 views
6

Ho i seguenti 2 strutture, e io non capisco il motivo per cui il secondo non funziona:Proprietà in strutture: "L'espressione è un valore e pertanto non può essere l'obiettivo di un compito."

Module Module1  
    Sub Main() 
    Dim myHuman As HumanStruct 
    myHuman.Left.Length = 70 
    myHuman.Right.Length = 70 

    Dim myHuman1 As HumanStruct1 
    myHuman1.Left.Length = 70 
    myHuman1.Right.Length = 70  
    End Sub 

    Structure HandStruct 
    Dim Length As Integer 
    End Structure 

    Structure HumanStruct 
    Dim Left As HandStruct 
    Dim Right As HandStruct 
    End Structure 

    Structure HumanStruct1 
    Dim Left As HandStruct 
    Private _Right As HandStruct 
    Public Property Right As HandStruct 
     Get 
     Return _Right 
     End Get 
     Set(value As HandStruct) 
     _Right = value 
     End Set 
    End Property  
    End Structure  
End Module 

enter image description here

spiegazione più dettagliata: ho qualche codice obsoleto che utilizza strutture invece di classi. Quindi ho bisogno di identificare un momento in cui un archivio di questa struttura cambia al valore sbagliato.

La mia soluzione per eseguire il debug è stata quella di sostituire la struttura archiviata da una proprietà con lo stesso nome e quindi ho appena impostato un punto di interruzione nel setter della proprietà per identificare il momento in cui ricevo il valore sbagliato ... in modo da non riscrivi tutto il codice .... solo per scopi di debug.

Ora, ho affrontato il problema di cui sopra, quindi non so cosa fare ... solo l'impostazione del punto di interruzione in tutto il mondo è stato assegnato a questo utente di struttura, ma c'è un sacco di linee con quella assegnazione ...

risposta

6

È solo una questione di cosa sta succedendo quando si esegue il programma. Il getter restituisce una copia della tua struct, tu ne imposti un valore, quindi quella copia della struct esce dall'ambito (quindi il valore modificato non fa nulla). Il compilatore mostra questo come un errore poiché probabilmente non è ciò che intendevi. Fai qualcosa del genere:

Dim tempRightHand as HandStruct 
tempRightHand = myHuman.Right 
tempRightHand.Length = 70 
myHuman.Right = tempRightHand 

La sinistra funziona perché si accede direttamente anziché tramite una proprietà.

+0

grazie, Kevin. Ho aggiunto una piccola spiegazione del perché ho fatto questi test. – serhio

+0

@serhio Nessun problema, è qualcosa che emerge sempre quando si creano proprietà con tipi di struct (come ad esempio 'TimeSpan'). IIRC non era un errore di compilazione e semplicemente non funzionava, il che era probabilmente ancora più frustrante. –

+0

il getter restituisce una copia di questa struttura ... potrei forzarla "byref"?) – serhio

Problemi correlati