2013-02-14 79 views
23

评价typeof(Object[,][]).Name给出Object[][,]为什么typeof(Object [,] [])。Name等于“Object [] [,]”?

同样,typeof(Object[][,]).Name给出Object[,][]

好像逗号移动无故。

什么给?

+0

我发现改变逗号位置的规则,但我不知道它为什么会这样。逗号反映到阵列的中心。例如; '[] [] [] [] [] [] [] [] [] [] [] [] [] [] [] ] [,] []','[] [] [,] [] []''会给你'[] [] [,] [] []'作为结果。 – 2013-02-14 20:47:36

+1

+1。很好的问题! – ja72 2013-02-14 20:47:55

+2

@SonerGönül:尝试'[] [,] [,,] [,,,] [,,,,]' - 现在清楚发生了什么? – 2013-02-14 20:49:32

回答

19

混合不规则和矩形阵列是疯狂的秘诀。你关于给定类型符号的含义的直觉几乎总是错的,或者至少是我的。

阅读关于这个问题我的文章,看看有没有什么帮助你了解这是怎么回事:

http://blogs.msdn.com/b/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx

基本上是:C#和反思谱写两种不同的方式混合褴褛/矩形阵列,每个为他们自己的原因。

+0

+1,链接_“最好的引用”你实际上不会通过附加数组说明符将元素类型转换为该类型的数组。“_ – ja72 2013-02-14 20:50:52

+0

@ ja72:正确,在C#中是这种情况。但是在反射中,它不遵循C#规则,它只是轻松地将数组修饰符粘贴到类型名称的末尾,而不是中间。 – 2013-02-14 20:51:41

+0

感谢您的回答Eric。别担心 - 我的代码实际上并没有使用任何类型的代码。我正在编写一个工具,使用反射创建一个友好的公共API列表,并且此测试案例响起了警钟。 – RobSiklos 2013-02-14 20:59:55

3

撇开你可能想要声明这种奇特数组的目的,它看起来像反射产生数组名称的方式是递归的:首先,它产生数组元素类型的名称,然后附加square使用适当数量的逗号括号。

Object[,][]是一维数组的二维数组; 2D阵列的元素类型为Object[],因此总体结果为"Object[]"+"[,]"

这里是算法的工作方式另一个例子:

typeof(Object[][,][,,][,,,][,,,,]).Name 

Object[,,,,][,,,][,,][,][] 

我没有看到比执行效率等背后的理由:只要是一致的,如果语法与C#匹配或不匹配,则无关紧要。毕竟,C#不是.NET领域唯一的语言。

+1

正确;这里的奇怪之处在于C#说'object [,] []'是'object []'的一个二维数组,当它天真地看起来应该是'object [,]的一维数组' 。 – 2013-02-14 20:53:47