VB.NET中数组在Sub过程使用报错:Redim语句需要数组
解决“Redim statement requires an array”错误的方案
咱们来一步步拆解你遇到的问题,这个报错主要是几个细节处理不当导致的:
错误的核心原因
- 参数命名冲突:你把参数命名为
Array,这可是VB.NET的关键字,编译器很容易混淆,绝对不能这么用。 - 参数类型不匹配:你用
Array As Array传递的是.NET的Array基类对象,而ReDim需要直接操作具体的数组变量(比如String(,)这种二维字符串数组),不是这个抽象的基类。 - 数组传递方式错误:要修改数组的大小(用
ReDim),必须用ByRef传递参数,不然过程里修改的只是副本,还会触发类型不匹配问题。
修正后的代码示例
第一步:调整公共类的数组声明
把固定大小的数组改成动态二维数组(一开始不指定大小,方便后续ReDim调整):
Public TstukkenArray(,) As String ' 动态二维字符串数组,未指定初始大小
第二步:重写填充数组的Sub过程
' 从DataSet加载数据到二维字符串数组 Sub LoadDataToArray(ds As DataSet, tableName As String, ByRef targetArray(,) As String) ' 获取目标DataTable Dim dt As DataTable = ds.Tables(tableName) If dt Is Nothing OrElse dt.Rows.Count = 0 Then ' 空表时重置数组 ReDim targetArray(1, 0) Return End If ' 定义计数器 Dim i As Integer, j As Integer ' 重新定义数组大小:第一维对应列数,第二维对应行数 ' 注意:ReDim Preserve 仅能修改多维数组的最后一维,如需保留原有数据要注意维度顺序 ReDim targetArray(dt.Columns.Count - 1, dt.Rows.Count - 1) ' 遍历DataTable填充数组 For i = 0 To dt.Rows.Count - 1 For j = 0 To dt.Columns.Count - 1 targetArray(j, i) = dt.Rows(i)(j).ToString() Next Next End Sub
第三步:调用过程示例
' 假设你已经有了初始化好的DataSet实例ds LoadDataToArray(ds, "你的目标表名", TstukkenArray)
额外注意事项
- 多维数组的
ReDim Preserve限制:如果需要保留原有数据,ReDim Preserve只能修改多维数组的最后一个维度。比如你的数组是(列数, 行数),修改行数(最后一维)可以用Preserve,但修改列数则无法保留数据。 - 避开关键字命名:永远不要用VB.NET的关键字(比如
Array、String、Integer)作为变量名或参数名,这会让编译器产生混淆,引发各种奇怪的错误。
内容的提问来源于stack exchange,提问作者Fyer-Zero
相关产品推荐
相关产品推荐

