.net 为什么我不能把indexer作为ref参数传递?

n53p2ov0  于 2023-01-10  发布在  .NET
关注(0)|答案(2)|浏览(104)

我明白规矩。但谁知道为什么呢?
如果我的代码是:

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#的架构师需要这个额外的步骤来传递一个指针?或者是编译器的限制?

vecaoik1

vecaoik11#

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

q35jwt9p

q35jwt9p2#

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的任何突变都反映在列表中。

相关问题