如何让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
相关产品推荐
相关产品推荐

