2011-08-24 112 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