要素に構造体を格納するようにしたListで構造体のプロパティやフィールドだけを変更しようとする場合は注意が必要です。 例えば、次のようなコードはコンパイルエラーとなります。
Listに格納されている構造体のフィールドを直接変更しようとした場合
Imports System
Imports System.Collections.Generic
' Listに格納する構造体
Structure S
Public F As Integer
Public Sub New(ByVal val As Integer)
F = val
End Sub
End Structure
Class Sample
Shared Sub Main()
Dim list As New List(Of S)()
' フィールドFに値3を設定した構造体を格納
list.Add(new S(3))
' インデックス0の構造体フィールドの値を変更したいが、コンパイルエラーとなる
list(0).F = 16
' error BC30068: Expression は値であるため、代入式のターゲットにすることはできません。
End Sub
End Class
このような操作を行いたい場合は、いったんListから一時変数に構造体をコピーし、値を変更してから再度Listに格納するようにします。
構造体ではなくクラスのインスタンスを格納する場合はこのような操作を行う必要はありません。 この違いは型が値型か参照型かによって決まります。 詳しくは値型と参照型 §.値型のプロパティ・インデクサを参照してください。