【问题标题】:Why does typeof(Object[,][]).Name equal "Object[][,]"?为什么 typeof(Object[,][]).Name 等于“Object[][,]”?
【发布时间】:2016-08-17 17:55:11
【问题描述】:

评估typeof(Object[,][]).Name 得到Object[][,]

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

好像逗号无缘无故移动了。

什么给了?

【问题讨论】:

  • 我找到了改变逗号位置的规则,但我不知道为什么会这样。逗号反射到数组的中心。例如; [,][][][][] 给你[][][][][,][][,][][][] 给你[][][][,][][][][,][][] 给你[][][,][][] 结果。
  • @SonerGönül:试试[][,][,,][,,,][,,,,]——现在清楚是怎么回事了吗?
  • @EricLippert 是的,谢谢。 FullName 属性也给出了相同的结果。也许这就是我们称之为反射的原因
  • @SonerGönül:搞笑!
  • 我遇到了一种情况,我需要将一个锯齿状的矩形数组数组转换成一个锯齿状的锯齿状数组。 T[][][,]T[][][][] 永远不会遇到问题。所以C# 设计师在这种情况下做了对程序员来说很自然的事情。当然,如果我看起来是反射型,我会彻底糊涂的。

标签: c# .net reflection multidimensional-array


【解决方案1】:

将参差不齐的阵列和矩形阵列混合在一起会导致精神错乱。您对给定类型符号含义的直觉几乎总是错误的,或者至少我的直觉是错误的。

阅读我关于该主题的文章,看看这是否有助于您了解这里发生的事情:

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

基本上:C# 和反射以两种不同的方式表示混合的不规则/矩形数组,每种方式都有自己的原因。

【讨论】:

  • +1,来自链接的最佳引用 “您实际上并没有通过附加数组说明符将元素类型转换为该类型的数组。”
  • @ja72:正确,在 C# 中就是这样。但是在不遵循 C# 规则的 Reflection 中,它只是爽快地将数组修饰符贴在类型名称的末尾,而不是在中间。
  • 感谢您的回答埃里克。别担心——我实际上并没有在我的代码中使用任何这样的类型。我正在编写一个工具,它使用反射创建一个友好的公共 API 列表,这个测试用例敲响了警钟。
  • 自从我与游戏开发人员打交道以来,我一直只使用平面一维数组和类似于indexOf(x, y) => y * arrayWidth + x; 的索引器,从而减少混乱并且通常更快!
  • 这真是令人兴奋。虽然我同意这种情况结束是错误代码的标志,但我认为 C# 对该表达式的解释非常违反直觉。如果我知道我的代码意味着,我会感觉更好,即使我必须以不同的方式键入声明和初始化,而不是统一编写它们但幸福地不知道它们究竟创建了什么。老实说,在我看来这是一个糟糕的语言设计决定。 (另一方面,当然,这是我在 C# 中看到的唯一糟糕的设计决策。)
【解决方案2】:

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

Object[,][]是一维数组的二维数组;二维数组的元素类型为Object[],所以整体结果为"Object[]"+"[,]"

这是算法工作方式的另一个说明:

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

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

除了实现的效率,我看不出背后的原因:只要一致,语法与C#匹配与否都无所谓。毕竟,C# 并不是 .NET 世界中唯一的语言。

【讨论】:

  • 正确;奇怪的是,C# 说 object[,][]object[] 的二维数组,而它看起来应该是 object[,] 的一维数组。
猜你喜欢
  • 2023-02-12
  • 2018-09-03
  • 2011-05-22
  • 2016-06-16
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多