перебирая 2-й массив в VB.Net - PullRequest
4 голосов
/ 24 августа 2011

Я был поражен (и в ужасе), что следующий код работает в 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», но компилятор настаивает на том, что итерация в двумерном массиве дает последовательность строк, а не последовательность массивов строк.

Я что-то не так делаю или реализация .Net двумерных массивов действительно такая хлипкая?

1 Ответ

2 голосов
/ 24 августа 2011

является ли реализация .Net двухмерных массивов действительно такой хлипкой?

Да.Многомерные массивы никогда не поддерживались в .NET.Я не уверен, почему они вообще существуют (в отличие от массивов массивов, то есть зубчатых массивов: String()()).В любом случае, вся поддержка адаптирована к частному случаю одномерных массивов.Тип каркаса для массивов всегда один и тот же, независимо от размерности, и реализация интерфейса (в данном случае IEnumerable(Of T)) адаптирована к этому распространенному случаю.

Это означает, что тип массивавсегда «массив строк», и поэтому он всегда реализует интерфейс IEnumerable(Of String).Это объясняет, почему ваш второй код не может работать : для того, чтобы он работал, тип массива должен быть другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...