ntt*_*lor 6 .net arrays iteration multidimensional-array
我很惊讶(也很害怕)以下代码可以在 Vb.Net 中运行
Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}
For Each s As String In test2DArr
MsgBox(s)
Next
Run Code Online (Sandbox Code Playgroud)
运行时,会弹出四个消息框,显示“A”、“B”、“C”和“D”。
换句话说,它的行为与以下完全相同:
Dim test1DArr As String() = {"A", "B", "C", "D"}
For Each s As String In test1DArr
MsgBox(s)
Next
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个“功能”吗?我需要在这里强加一些显然不受支持的结构。上面的第一个代码示例应该是:
Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}
For Each arr As String(,) In test2DArr
MsgBox(arr(0) & ", " & arr(1))
Next
Run Code Online (Sandbox Code Playgroud)
并应生成两个消息框:“A,B”和“C,D”,但编译器坚持认为迭代二维数组会生成字符串序列,而不是字符串数组序列。
是我做错了什么还是.Net 的二维数组实现真的那么脆弱?
\n\n\n.Net 的二维数组实现真的那么脆弱吗?
\n
是的。.NET 从未真正支持多维数组。I\xe2\x80\x99m 不确定它们为什么存在(与数组的数组相反,即锯齿状数组:)String()()。无论如何,所有支持都是针对一维数组的特殊情况而定制的。无论维数如何,数组的框架类型始终相同,并且接口实现(在本例中为IEnumerable(Of T))是针对这种常见用例定制的。
这意味着数组的类型始终是 strings\xe2\x80\x9d 的 \xe2\x80\x9carray,因此它始终实现接口IEnumerable(Of String)。这解释了为什么您的第二个代码无法工作:为了使其工作,数组的类型必须不同。