2012-02-14 53 views
2
Public Structure testStruct 
    Dim blah as integer 
    Dim foo as string 
    Dim bar as double 
End Structure 

'in another file .... 

Public Function blahFooBar() as Boolean 
    Dim tStrList as List (Of testStruct) = new List (Of testStruct) 

    For i as integer = 0 To 10 
     tStrList.Add(new testStruct) 
     tStrList.Item(i).blah = 1 
     tStrList.Item(i).foo = "Why won't I work?" 
     tStrList.Item(i).bar = 100.100 

     'last 3 lines give me error below 
    Next 

    return True 
End Function 

我得到的錯誤是:表達式是一個值,因此不能作爲賦值的目標。爲什麼這個結構列表不允許我爲該字段賦值?

爲什麼?

+2

簡單的解決方案:不要使用結構,使用類? – 2012-02-15 01:16:54

回答

2

我第二個意見使用類而不是結構。

你有困難的原因是你的結構是一個值類型。當您訪問列表中值類型的實例時,您會得到該值的副本。然後您試圖更改副本的值,這會導致錯誤。如果您使用過一個類,那麼您的代碼將按照書面方式工作。

1

嘗試首先創建對象作爲

Dim X = New testStruct 

和設置在該屬性作爲

testStruct.blah = "fiddlesticks" 

BEFORE其添加到列表中。

+0

我打算這樣做,但結構不能像班級一樣工作。這意味着列表中的所有結構都指向相同的結構,而不是不同的結構。 – dotnetN00b 2012-02-14 23:55:48

+0

即使在構造函數中有* New *有趣。這是我要記住的一個。 – deadlyvices 2012-02-15 06:59:39

+0

使用新建將創建結構的新實例。 – 2012-02-15 15:03:33

2

嘗試在for循環如下:

Dim tmp As New testStruct()  
tmp.blah = 1 
tmp.foo = "Why won't I work?" 
tmp.bar = 100.100 
tStrList.Add(tmp) 

展望這個我認爲它有東西時,你通過(T)的列表訪問它做的方式.NET副本的結構。

更多信息可用here

相關問題