要素に構造体を格納するようにしたListで構造体のプロパティやフィールドだけを変更しようとする場合は注意が必要です。 例えば、次のようなコードはコンパイルエラーとなります。
このような操作を行いたい場合は、いったんListから一時変数に構造体をコピーし、値を変更してから再度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))
' Listに格納した構造体フィールドの値を参照
Console.WriteLine("list(0).F = {0}", list(0).F)
' フィールドの値を変更したい構造体を一時変数にコピーする
Dim tmp As S = list(0)
' 一時変数に代入した構造体のフィールドの値を変更する
tmp.F = 16
' 変更した構造体を再度Listに格納する
list(0) = tmp
' Listに格納した構造体フィールドの値を参照
Console.WriteLine("list(0).F = {0}", list(0).F)
End Sub
End Class
実行結果
list[0].F = 3 list[0].F = 16
構造体ではなくクラスのインスタンスを格納する場合はこのような操作を行う必要はありません。 この違いは型が値型か参照型かによって決まります。 詳しくは値型と参照型 §.値型のプロパティ・インデクサを参照してください。