C#交错数组类型的反向声明

C#交错数组类型的反向声明,c#,multidimensional-array,jagged-arrays,C#,Multidimensional Array,Jagged Arrays,我只是有一个“什么…”的时刻。在C#中数组的“非自然”声明背后是否有一些模糊的推理 我本以为会是另一种情况。int[,][]声明一个一维数组,其中每个元素都是二维数组 有趣的是,类型的名称颠倒了: Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]" 有人能解释一下吗?这是故意的吗?(在Windows下使用.NET 4.5。)你可以在Eric Lippert的博客中找到一篇冗长的讨论 C#实际上做了什么 一团糟。无论我

我只是有一个“什么…”的时刻。在C#中数组的“非自然”声明背后是否有一些模糊的推理

我本以为会是另一种情况。int[,][]声明一个一维数组,其中每个元素都是二维数组

有趣的是,类型的名称颠倒了:

Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]"

有人能解释一下吗?这是故意的吗?(在Windows下使用.NET 4.5。)

你可以在Eric Lippert的博客中找到一篇冗长的讨论

C#实际上做了什么

一团糟。无论我们选择哪一种选择,最终都会有一些不好的结果 符合我们的直觉。以下是我们在C#中实际选择的内容

首先:选项二[这是一个二维数组,每个元素是一个一维整数数组]是正确的。我们强迫你和我们一起生活 结果一所导致的怪异;你实际上并没有做一个决定 通过追加数组将元素类型添加到该类型的数组中 说明符。通过在说明符前面加上前缀,将其转换为数组类型 添加到现有数组说明符列表。疯狂但真实

单词“prepending”部分解释了反向类型名称的输出。CLR类型名称不一定与C#声明相同

但更相关的报价在底部:

总之,多维不规则数组几乎肯定是一种糟糕的代码味道。

我第一次看到
newint[5][]时也有同样的“what the…”时刻而不是
新的int[][5]

EL(非常好)的博客帖子围绕着一件事起舞:有一种完美的方式可以为拥有ComSci学位的人做到这一点,但没有一种好的方式可以为其他人做到这一点。如果只是按照语法进行操作,则从右向左声明,
new
从右向左并从左向右索引:

// 1D array of 2D arrays, no special rules needed:
int[,][] N; N=new[,][5]; N[0]=new int[4,4];

但是C#的目标受众不是拥有4年CS学位的人(他们都看过从右到左的反向波兰语和爱情)。IMHO,理解C#锯齿阵列的诀窍在于,他们决定为自己制定特殊规则,而在技术上并不需要的时候。

谢谢你的链接。它解释了一切。我完全不同意他的推理什么是“合理的”,但那是另一个话题。至少现在我知道有人想到了这一点,做出了一些有意识的(但奇怪的)决定。(可能是因为我是德国人,习惯把24拼成“four and two”:D)
// 1D array of 2D arrays, no special rules needed:
int[,][] N; N=new[,][5]; N[0]=new int[4,4];