要素に構造体を格納するようにしたListで構造体のプロパティやフィールドだけを変更しようとする場合は注意が必要です。 例えば、次のようなコードはコンパイルエラーとなります。
このような操作を行いたい場合は、いったんListから一時変数に構造体をコピーし、値を変更してから再度Listに格納するようにします。
Listに格納されている構造体のフィールドを変更する
using System;
using System.Collections.Generic;
// Listに格納する構造体
struct S {
public int F;
public S(int f)
{
F = f;
}
}
class Sample {
static void Main()
{
var list = new List<S>();
// フィールドFに値3を設定した構造体を格納
list.Add(new S(3));
// Listに格納した構造体フィールドの値を参照
Console.WriteLine("list[0].F = {0}", list[0].F);
// フィールドの値を変更したい構造体を一時変数にコピーする
var tmp = list[0];
// 一時変数に代入した構造体のフィールドの値を変更する
tmp.F = 16;
// 変更した構造体を再度Listに格納する
list[0] = tmp;
// Listに格納した構造体フィールドの値を参照
Console.WriteLine("list[0].F = {0}", list[0].F);
}
}
実行結果
list[0].F = 3 list[0].F = 16
構造体ではなくクラスのインスタンスを格納する場合はこのような操作を行う必要はありません。 この違いは型が値型か参照型かによって決まります。 詳しくは値型と参照型 §.値型のプロパティ・インデクサを参照してください。