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

为何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:25:17