为何修改readonly修饰的数组时编译器未报错?
为什么readonly修饰的数组可以修改元素且编译器允许?
先看你给出的代码:
public class SimpleStack { private readonly double[] _items; public void Push(double item) { _items[0] = item; } }
这是对readonly关键字的作用理解偏差导致的疑问,核心逻辑很简单:
readonly管的是变量本身,不是变量指向的对象内容。- 数组属于引用类型,
_items这个变量存的是数组在内存堆上的地址。readonly的约束仅仅是禁止给这个变量重新赋值(比如不能写_items = new double[5];),但堆上数组内部的元素修改,和_items的引用地址没关系,所以编译器不会拦着。
举个反例就能明白:如果在Push方法里尝试重新给_items赋值,比如:
public void Push(double item) { _items = new double[10]; // 这里编译器直接报错 _items[0] = item; }
这时候编译器就会提示违反readonly约束,但修改数组元素的操作没改变_items的引用地址,所以完全符合规则。
内容的提问来源于stack exchange,提问作者jhon.smith
相关产品推荐
相关产品推荐

