我明白规矩。但谁知道为什么呢?
如果我的代码是:
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条答案
按热度按时间vecaoik11#
索引器值不归类为变量;因此,您不能将索引器值作为ref或out参数传递。
参考msdn
q35jwt9p2#
ref x[y]
只是一个指向我感兴趣的T
示例的指针,不是吗?如果
T
是一个引用类型,那么是的,如果T
是一个值类型,那么不是,但是这不重要,我们暂时假设它是,因为方法是ref T
,它需要接受一个变量的引用,这个变量是T
的一个示例的指针,你只有一个指针,而不是指针的 * 存储位置 *。(注意,我停留在你的类比范围内。从技术上讲,你没有“指针”,你有对对象的引用,但这个类比对于这个问题的目的来说已经足够好了。)列表索引器的getter不会解析为给定值的存储位置,它只解析为一个值。还要注意,当你写:
你没有把
cX
的任何变异反映到列表中。你需要写:因为它实际上等同于确保
M1
中 * 变量 * cX的任何突变都反映在列表中。