迭代VB.Net中的二维数组

我对以下代码在Vb.Net中工作感到惊讶(并且感到震惊)

Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}

For Each s As String In test2DArr
  MsgBox(s)
Next

运行时,弹出四个消息框,显示“A”,“B”,“C”,然后“D”.

换句话说,它具有与以下完全相同的行为:

Dim test1DArr As String() = {"A", "B", "C", "D"}

For Each s As String In test1DArr
  MsgBox(s)
Next

有人可以解释这个“功能”吗?我需要在这里施加一些显然不受支持的结构.上面的第一个代码示例应该是:

Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}

For Each arr As String(,) In test2DArr
  MsgBox(arr(0) & ", " & arr(1))
Next

并且应该产生两个消息框:“A,B”和“C,D”,但是编译器坚持认为迭代2-d数组会产生一个字符串序列,而不是一串字符串数组.

我做错了什么,或者.Net的2-D阵列实现真的很脆弱?

最佳答案

is .Net’s implementation of 2-D arrays really that flimsy?

是. .NET中从未真正支持多维数组.我不确定它们为什么存在(与数组数组相反,即锯齿状数组:String()()).在任何情况下,所有支持都是针对一维数组的特殊情况而定制的.无论维度如何,数组的框架类型总是相同的,并且接口实现(在这种情况下为IEnumerable(Of T))是针对这种常见用例而定制的.

这意味着数组的类型始终是“字符串数组”,因此它始终实现接口IEnumerable(Of String).这解释了为什么你的第二个代码无法工作:为了使它工作,数组的类型必须是不同的.

点赞