2013-08-02 53 views
6

我有以下2層結構,我真的不明白,爲什麼第二個不工作:結構中的屬性:「表達式是一個值,因此不能作爲賦值的目標。」

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

更詳細的解釋:我有一個使用的結構有些過時代碼而不是類。所以我需要確定一個當這個結構的一個字段變成錯誤值的時刻。

我的調試解決方案是用相同名稱的屬性替換結構,然後我只是在屬性設置器中設置一個斷點來識別我收到錯誤值的時刻......爲了不要重寫所有代碼....僅用於調試目的。

現在,我面臨上面的問題,所以我不知道該怎麼辦......只有設置斷點這個結構的成員被分配到任何地方,但是這個賦值有很多行......

回答

6

這只是當你運行程序時發生的事情的問題。 getter返回你的結構的一個副本,你爲它設置一個值,然後該結構的副本超出範圍(所以修改後的值不會執行任何操作)。編譯器顯示這是一個錯誤,因爲它可能不是你想要的。做這樣的事情:

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

左邊的作品,因爲你直接訪問它,而不是通過屬性。

+0

謝謝凱文。我加了一點解釋爲什麼我做了這個測試。 – serhio

+0

@serhio沒問題,當從結構類型中創建屬性時,總會出現這種情況(例如'TimeSpan')。 IIRC它曾經不是一個編譯錯誤,只是簡單地不起作用,這可能更令人沮喪。 –

+0

getter返回這個結構的副本......我可以強制它「byref」嗎? ) – serhio