我对以下代码在Vb.Net中工作感到惊讶(并且感到震惊) Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}For Each s As String In test2DArr MsgBox(s)Next 运行时,弹出四个消息框,显示“A”,“B”,“C”,然后“
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).这解释了为什么你的第二个代码无法工作:为了使它工作,数组的类型必须是不同的.