我理解规则。但谁知道为什么会这样呢?
如果我的代码是:
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#的架构师需要这个额外的步骤来传递指针?或者它是编译器限制吗?
答案 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的任何突变都反映在列表中。