You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过引用访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:52:41