如何通过引用访问C#自定义类的索引器?
问题分析与解决方案
你的问题核心出在索引器的返回类型设计上——当前你的索引器返回的是int值类型的副本,而非原元素的引用,这就导致无法用ref来传递它。
为什么原代码会报错?
值类型(比如int)在被返回时会生成一个临时副本,intArray[0]拿到的只是_thisArray[0]的拷贝,并非指向原内存位置的引用。C#不允许对这种临时副本使用ref,因为它的生命周期极短,修改它对原数据毫无意义,所以编译器会直接抛出错误。
而你直接用ref _thisArray[0]能正常工作,是因为数组的索引访问本身就支持返回元素的引用(数组属于引用类型,它的索引器本质上是直接指向内部元素的内存地址)。
如何修改索引器支持引用访问?
你需要把索引器的get访问器改成返回**ref int**,这样索引器就会返回原数组元素的引用,而非副本。修改后的代码如下:
public class IntArray { protected int[] _thisArray = new int[20]; // 返回引用的索引器 public ref int this[int index] { get => ref _thisArray[index]; // 可选:如果需要直接通过索引器赋值(比如 intArray[0] = 5;),可以添加setter set => _thisArray[index] = value; } }
修改后的调用代码
现在你的AccessWithReference方法就能正常运行了,因为intArray[0]返回的是原数组元素的引用,ref intArray[0]是完全合法的:
private void AccessWithReference() { var intArray = new IntArray(); SetByReference(ref intArray[0]); } private void SetByReference(ref int value) { value = 0; }
这样调用后,_thisArray[0]的值会被成功修改为0,和你直接操作底层数组的效果完全一致。
内容的提问来源于stack exchange,提问作者Jack Mariani
相关产品推荐
相关产品推荐

