2011-08-24 55 views
4

迭代我很惊讶(和恐惧),下面的代码在Vb.Net工作〜2-d阵列中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的二维数组的实现真的很脆弱吗?

+0

+1这对我来说绝对是迷人的。如果其他读者想要亲自体验它,我会在这里设置这种情况(http://rextester.com/rundotnet?code=SSBCAH17268)。 – ckittel

回答

2

是.net的二维数组的实现真的很脆弱吗?

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

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

+1

哇。这是极其蹩脚的。另一方面,你的回答很好。谢谢,并且也感谢我将锯齿阵列放在了我的头上,这在.NET中我从来没有做过。他们提供了一个丑陋的,但仍然有用的解决这个问题。 – nttaylor