哪个版本IList<T>[i].Method()
要求索引器?设定版本还是获取版本?我有List<MutableStruct> list
。我通过list[0].MutableMethod()
调用了一个可变方法,并且找不到list[0]
。我认为它调用get版本,而隐式副本使得意外。请确认。感谢。
答案 0 :(得分:4)
这是因为当传递结构时,您将获得整个结构与引用类型的副本,其中副本是引用。这意味着一旦从结构列表中获取结构,就会有一个副本,并且该副本上会调用该方法,而不是列表中的方法。为此,您必须将列表中的值分配给变量,然后对其进行变更,然后再将其分配。这就是为什么可变结构被认为是一个坏主意
实施例
public struct MutableStruct
{
public int Value { get; private set; }
public void MutableMethod()
{
Value = 5;
}
}
使用此代码
var list = new List<MutableStruct>();
list.Add(new MutableStruct());
Console.WriteLine(list[0].Value);
list[0].MutableMethod();
Console.WriteLine(list[0].Value);
var x = list[0];
x.MutableMethod();
list[0] = x;
Console.WriteLine(list[0].Value);
输出
0
0
5