2013-08-02 14 views
6

mam następujące 2 struktur, a ja naprawdę nie rozumiem dlaczego drugi nie działa:Właściwości w strukturach: "Wyrażenie jest wartością i dlatego nie może być celem przypisania".

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

Bardziej szczegółowe wyjaśnienie: mam trochę przestarzały kod, który używa struktur zamiast klas. Muszę więc określić moment, w którym pole tej struktury zmieni się na niewłaściwą wartość.

Moim rozwiązaniem do debugowania była zamiana struktury złożonej przez właściwość o tej samej nazwie, a następnie po prostu ustawię wartość graniczną w selektorze właściwości, aby zidentyfikować moment, w którym otrzymuję niewłaściwą wartość ... w celu uniknięcia przepisać cały kod ... tylko dla celów debugowania.

Teraz zmierzyłem się z powyższym problemem, więc nie wiem, co robić ... tylko ustawianie punktu przerwania wszędzie, gdzie ten element struktury jest przypisany, ale jest dużo linii z tym zadaniem ...

Odpowiedz

6

To tylko kwestia tego, co się dzieje, gdy uruchamiasz program. Getter zwraca kopię twojej struktury, ustawiasz na niej wartość, wtedy ta kopia struktury wychodzi poza zakres (więc zmodyfikowana wartość nic nie robi). Kompilator pokazuje to jako błąd, ponieważ prawdopodobnie nie jest to zgodne z zamierzeniem użytkownika. Zrób coś takiego:

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

Lewy działa, ponieważ masz do niego bezpośredni dostęp, a nie przez właściwość.

+0

dzięki, Kevin. Dodałem trochę wyjaśnienia, dlaczego wykonałem te testy. – serhio

+0

@serhio Nie ma problemu, to coś, co zawsze pojawia się podczas tworzenia właściwości z typów struct (np. 'TimeSpan' na przykład). IIRC nie był to błąd kompilacji i po prostu nie działał, co było prawdopodobnie jeszcze bardziej frustrujące. –

+0

getter zwraca kopię tej struktury ... czy mogę ją wymusić "byref"?) – serhio

Powiązane problemy