C#多维数组是独立类型,int[,]与int[][]完全不兼容;声明时逗号数=维度数−1,初始化需行列一致,访问用a[0,1]而非a0,越界抛IndexOutOfRangeException。

直接说结论:C# 多维数组不是“语法糖”,而是独立类型,int[,] 和 int[][](交错数组)完全不兼容,混用会编译失败或运行时异常。
声明和初始化时维度括号数量必须匹配
逗号数 = 维度数 − 1,这是硬性语法约束,编译器不会推断或容错。
-
int[,] a是二维,int[,,] b是三维,int[,,,] c是四维 —— 少一个逗号就报错 CS0673 - 初始化时若显式指定尺寸(如
new int[2,3]),大括号内必须恰好有 2 行、每行恰好 3 个元素;否则编译报错 CS0846 - 省略尺寸写
new int[,] { {1,2}, {3,4} }是合法的,但此时所有子数组长度必须一致,{ {1,2}, {3,4,5} }会触发 CS0845
访问元素必须用逗号分隔索引,不能用方括号链
多维数组是矩形结构,索引不是嵌套的,a[0][1] 这种写法只适用于交错数组 int[][],对 int[,] 直接编译失败。
- 正确写法:
a[0, 1]、b[1, 0, 2]、c[0, 1, 2, 3] - 越界访问(如
a[5, 0]超出行数)抛出IndexOutOfRangeException,不是编译时错误 - 没有
a.Length[i]这种语法 ——Length是总元素数,单维度长度要用GetLength(0)、GetLength(1)等
传参和类型转换需警惕隐式转换陷阱
多维数组是独立的引用类型,不能隐式转成一维数组,也不能和 Array 基类做泛型协变操作。
-
void Process(int[,] m)只接受int[,],传int[][]或int[]都编译失败 -
Array.Copy支持多维数组,但目标数组也必须是同维数、同类型的多维数组,否则抛ArgumentException - 想遍历所有元素?别用
foreach (var x in arr)后直接当int用 —— 它确实能枚举值,但丢失坐标信息,且无法反向写入
最易被忽略的是:多维数组的内存布局虽连续,但索引计算依赖维度顺序(行主序),GetLength(0) 永远是第一维长度,哪怕你把它当作“列”来逻辑使用。写性能敏感代码时,循环顺序影响缓存命中率,这点和 C/C++ 一致,但 C# 不提供指针级控制,只能靠维度顺序设计来优化。


















