C#倒序声明交错数组类型

7

我刚刚经历了一次“什么鬼”的时刻。下面这个是有意义的吗?在C#中声明数组为什么要这样非自然的方式?

int[,][] i; // declares an 2D - array where each element is an int[] !
// you have to use it like this:
i = new int[2,3][];
i[1,2] = new int[0];

我原本希望它是反过来的。int[,][] 声明了一个一维数组,其中每个元素都是一个二维数组。

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

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

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

2个回答

8
你可以在 Eric Lippert 的博客 《数组的数组》 中找到一篇长篇讨论。

C# 实际上做了什么

这很混乱。无论我们选择哪个选项,都会导致某些东西与我们的直觉不符。下面是 C# 实际上的选择。

首先:选项二 [这是一个二维数组,每个元素是一个整型一维数组] 是正确的。我们强制你接受由 Consequence One 带来的怪异之处;事实上,通过在现有的数组说明符列表之前添加指示符,才能将元素类型变为该类型的数组,而不是通过附加数组说明符来实现。疯狂但却是真的。

'prepending' 这个词部分解释了你输出的反转类型名称。CLR 类型名称不一定与 C# 声明相同。

但更相关的引用位于底部:

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


谢谢你提供的链接,它解释得非常清楚。我完全不同意他所谓的“合理”的推理,但这是另一个话题了。至少现在我知道有人考虑过这个问题并做出了一些有意识(但奇怪)的决定。(也许这是因为我是德国人,习惯于把24拼写为“four-and-twenty” :D) - Imi

1
我第一次看到new int[5][];而不是new int[][5];时,也有同样的“什么鬼”的感觉。
EL(非常好的)博客文章围绕着一件事:对于拥有计算机科学学位的人来说,有一种完美的方法,但对于其他人来说,没有好的方法。如果你只是遵循语法,你会从右到左声明,从右到左使用new,并从左到右索引。
// 1D array of 2D arrays, no special rules needed:
int[,][] N; N=new[,][5]; N[0]=new int[4,4];

但是,C# 的目标受众并不是拥有 4 年计算机科学学位的人(他们都看过逆波兰式,并喜欢从右向左) 。在理解 C# 嵌套数组方面的诀窍在于,他们决定为它们制定特殊规则,虽然在技术上并不需要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接