为什么我不能将indexer作为ref参数传递?

时间:2016-11-04 13:49:29

标签: c# .net

我理解规则。但谁知道为什么会这样呢?

如果我的代码是:

List<T> x = new List<T>;
x.Add(new T());
x.Add(new T());
x.Add(new T());

int y = 2;

//And I call a method 
M1(ref x[y]);

ref x [y]只是指向我感兴趣的T实例的指针不是吗?

为什么我不能以非常简单的方式编写代码行称为M1()。

我知道解决方法:

T cX = x[y];
M1(ref cX);

我希望听到为什么c#的架构师需要这个额外的步骤来传递指针?或者它是编译器限制吗?

2 个答案:

答案 0 :(得分:3)

索引器值未归类为变量;因此,您不能将索引器值作为ref或out参数传递。

参考msdn

答案 1 :(得分:1)

  

ref x[y]只是指向我感兴趣的T实例的指针不是吗?

好吧,如果T是引用类型,那么是。如果T是一个值类型,那么不,但这没关系,让我们暂时假设它。由于该方法是ref T,因此需要接受对变量的引用,该变量是指向T实例的指针。你只有一个指针,而不是指针的存储位置。 (请注意,我保持在你的类比之内。从技术上讲,你没有“指针”,你有一个对象的引用,但这个类比对于这个问题来说已经足够了。)

列表的索引器的getter不会解析为给定值的存储位置,它只会解析为一个值。还要注意,当你写:

T cX = x[y];
M1(ref cX);

您没有将cX的任何突变反映到列表中。你需要写:

T cX = x[y];
M1(ref cX);
x[y] = cX;

它实际上相当于确保M1变量 cX的任何突变都反映在列表中。