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。)

4

2 回答 2

8

您可以在 Eric Lippert 的博客Arrays of arrays中找到冗长的讨论。

C# 实际上做了什么

一团糟。无论我们选择哪个选项,最终都会与我们的直觉不符。这是我们在 C# 中实际选择的内容。

首先:选项二[这是一个二维数组,每个元素都是一个一维整数数组]是正确的。我们强迫你忍受后果一所带来的怪异;您实际上并没有通过附加数组说明符将元素类型转换为该类型的数组。您可以通过将说明符添加到现有数组说明符列表中来使其成为数组类型。疯狂但真实。

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

但更相关的报价在底部:

话虽如此,多维参差不齐的数组几乎肯定是一种不好的代码气味。

于 2012-09-21T15:14:30.660 回答
1

我第一次看到时有相同的“什么...”时刻,new int[5][];而不是new int[][5];

EL's (very nice) blog post is dancing around one thing: there's a perfect way to do it for people with a ComSci degree, but no good way to do it for others. If you just follow the grammar, you declare right-to-left, new right-to-left and index left-to-right:

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

But C#'s target audience isn't people with 4-year CS degrees (who have all seen Reverse Polish and love right-to-left.) The trick, IMHO, in understanding C# jagged arrays is that they decided to make special rules for them, when they didn't technically need to.

于 2016-03-04T23:34:20.893 回答