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

为何C#中索引操作会修改整列元素而非单个元素?

问题原因解析

你遇到的问题核心是引用类型的复用,具体原因如下:

错误初始化方式的问题点

这段代码:

int[][] m_dist = Enumerable.Repeat(Enumerable.Repeat(-1, m.Length).ToArray(), m.Length).ToArray();

执行逻辑是:

  1. 先执行Enumerable.Repeat(-1, m.Length).ToArray(),创建一个int[]类型的数组实例,所有元素初始化为-1。
  2. 外层的Enumerable.Repeat(..., m.Length)只是把这个同一个数组的引用重复了m.Length次,最终转成二维数组后,m_dist的每一行都指向这个唯一的数组实例。

所以当你执行m_dist[1][1] = 0时,本质是修改了这个共享数组的第2个元素,而二维数组的所有行都引用它,自然所有行的对应位置都会同步变成0。

循环初始化为什么正常

循环代码里:

int[][] m_dist = new int[m.Length][];
for (int i = 0; i < m_dist.Length; i++)
{
    m_dist[i] = new int[m.Length];
    for (int j = 0; j < m_dist[i].Length; j++)
    {
        m_dist[i][j] = -1;
    }
}

每次循环到m_dist[i] = new int[m.Length]时,都会创建一个全新的int[]数组实例,二维数组的每一行都是独立的数组,互相没有引用关联。修改某一行的元素只会影响当前行,不会波及其他行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:45:33