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

如何让C#自定义索引器实现数组索引器的直接赋值行为?

问题原因与解决方法

为什么数组索引器可以直接操作值类型成员?

数组是CLR提供的特殊类型,针对值类型元素的索引器,它返回的是元素本身的引用(ref),而非值的副本。当你写container.items[0].variable = 2;时,本质是直接操作数组内存中对应位置的Item实例,修改的是原对象的成员,自然能正常运行。

而你的自定义索引器的get访问器返回的是Item值类型的副本——container[0]会创建一个临时的Item拷贝,修改这个临时拷贝的成员不仅不会影响原数组里的元素,编译器还会直接阻止这种无意义的操作,抛出CS1612错误。

实现自定义索引器的数组式行为

要让自定义索引器支持直接修改值类型成员,需要使用C# 7.2及以上版本提供的ref索引器,让get访问器返回原元素的引用:

public struct Item
{
    public float variable;
}

public class Container
{
    public Item[] items;
    // 定义ref索引器
    public ref Item this[int i] 
    { 
        get => ref items[i]; 
        set => items[i] = value; 
    }
}

修改后,container[0].variable = 2;就能像数组索引器一样直接操作原Item实例的成员,行为和数组索引器完全一致。

内容的提问来源于stack exchange,提问作者Everday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:22:05