2013-08-02 9 views
6

私は、次の2つの構造を有する、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

より詳細な説明:私は構造体を使用して、いくつかの時代遅れのコードを持っていますクラスの代わりに。だから私は、この構造のフィールドが間違った値に変化する瞬間を特定する必要があります。

私の解決策は、同じ名前のプロパティーで保存された構造体を置き換えることでした。プロパティーセッターにbreackpointを設定して、誤った値を受け取った瞬間を特定しました...すべてのコードを書き直す....デバッグ目的のために。

今、私は何をすべきかわからないので、この構造体のメンバーが割り当てられているどこにでもブレークポイントを設定するだけですが、その割り当てで多くの行があります...

答えて

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

関連する問題