要素に構造体を格納するようにした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));
// インデックス0の構造体フィールドの値を変更したいが、コンパイルエラーとなる
list[0].F = 16;
// error CS1612: 変数ではないため、'System.Collections.Generic.List<S>.this[int]'の戻り値を変更できません。
}
}
このような操作を行いたい場合は、いったんListから一時変数に構造体をコピーし、値を変更してから再度Listに格納するようにします。
構造体ではなくクラスのインスタンスを格納する場合はこのような操作を行う必要はありません。 この違いは型が値型か参照型かによって決まります。 詳しくは値型と参照型 §.値型のプロパティ・インデクサを参照してください。