哪个版本IList [i] .Method()调用?

时间:2016-05-25 17:30:52

标签: c# list mutable

哪个版本IList<T>[i].Method()要求索引器?设定版本还是获取版本?我有List<MutableStruct> list。我通过list[0].MutableMethod()调用了一个可变方法,并且找不到list[0]。我认为它调用get版本,而隐式副本使得意外。请确认。感谢。

1 个答案:

答案 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