2013-08-02 6 views
6

Ich habe die folgenden zwei Strukturen, und ich weiß nicht wirklich verstehen, warum die zweiten nicht funktioniert:Eigenschaften in Strukturen: "Ausdruck ist ein Wert und kann daher nicht das Ziel einer Zuweisung sein."

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

Detailliertere Erklärung: Ich habe einigen veralteten Code, Strukturen verwendet statt Klassen. Also muss ich einen Moment identifizieren, wenn sich ein Feld dieser Struktur auf den falschen Wert ändert.

Meine Lösung zum Debugging war, die Struktur durch eine Eigenschaft mit dem gleichen Namen ersetzt zu ersetzen, und dann habe ich gerade einen Breakpunkt im Property Setter gesetzt, um den Moment zu identifizieren, wenn ich den falschen Wert erhalte ... um das nicht zu tun den gesamten Code neu schreiben .... nur zum Debuggen.

Jetzt habe ich das oben genannte Problem, also weiß ich nicht, was zu tun ist ... nur den Haltepunkt überall dort, wo dieses Mitglied der Struktur zugewiesen ist, aber es gibt viele Linien mit dieser Zuordnung ...

Antwort

6

Es ist nur eine Frage dessen, was passiert, wenn Sie das Programm ausführen. Der Getter gibt eine Kopie Ihrer Struktur zurück, Sie setzen einen Wert darauf, dann geht diese Kopie der Struktur außerhalb des Bereichs (so dass der modifizierte Wert nichts tut). Der Compiler zeigt dies als Fehler an, da es wahrscheinlich nicht das ist, was Sie beabsichtigt haben. Tun Sie etwas wie das:

Die linke funktioniert, weil Sie auf es direkt statt über eine Eigenschaft zugreifen.

+0

danke, Kevin. Ich habe eine kleine Erklärung hinzugefügt, warum ich diese Tests gemacht habe. – serhio

+0

@serhio Kein Problem, es kommt immer wieder vor, wenn Eigenschaften aus Struct-Typen gemacht werden (wie zum Beispiel 'TimeSpan'). IIRC war früher kein Kompilierfehler und würde einfach nicht funktionieren, was wahrscheinlich noch frustrierender war. –

+0

der Getter gibt eine Kopie dieser Struktur zurück ... könnte ich es zwingen "byref"?) – serhio

Verwandte Themen