VB.NET For Next循环操作Dictionary报变量声明语法错误如何解决
问题根因
VB.NET是静态编译型语言,过程内声明的局部变量名是编译阶段就完成解析绑定的,你无法在运行时通过拼接字符串的方式生成变量名,来访问对应变量。你写的("Dictionary" & i).Add(...)里,"Dictionary" & i的运算结果只是普通字符串,不是你之前声明的字典对象,完全不符合VB的语法规则,自然会触发编译错误。
顺带提一句,你贴的第一段“可正常运行”的代码本身存在不规范的地方:你声明的字典值类型是Integer,但Add时传入的第二个参数是字符串"36",只是VB默认开启了宽松的隐式类型转换,自动帮你把字符串转成了整数才没报错,开启严格类型检查后这段代码也会抛出类型不匹配的错误。
修复方案
批量管理同类型对象不要声明5个独立变量,直接用数组或者List集合存储所有字典对象,循环时按索引访问对应对象即可,这是最简洁、符合编码规范的写法:
Private Sub Button2_Click(sender As Object, e As RoutedEventArgs) Handles Button2.Click ' 初始化长度为5的字典数组,每个元素都是一个新的String-Integer类型字典 Dim dictList = Enumerable.Range(1, 5). Select(Function() New Dictionary(Of String, Integer)()). ToArray() ' 循环给每个字典添加键值对,值直接传整数36,不要传字符串 For i As Integer = 0 To dictList.Length - 1 dictList(i).Add("George", 36) Next ' 后续使用时按索引取对应字典即可: ' dictList(0) 对应你原本的Dictionary1 ' dictList(1) 对应你原本的Dictionary2 ' 索引依次顺延即可 End Sub
如果你受业务逻辑限制,必须保留Dictionary1到Dictionary5这5个独立命名的变量,那只能在循环内通过分支判断,手动匹配变量,这种写法冗余度很高,非必要不使用:
Private Sub Button2_Click(sender As Object, e As RoutedEventArgs) Handles Button2.Click Dim Dictionary1 As New Dictionary(Of String, Integer) Dim Dictionary2 As New Dictionary(Of String, Integer) Dim Dictionary3 As New Dictionary(Of String, Integer) Dim Dictionary4 As New Dictionary(Of String, Integer) Dim Dictionary5 As New Dictionary(Of String, Integer) For i As Integer = 1 To 5 Select Case i Case 1 : Dictionary1.Add("George", 36) Case 2 : Dictionary2.Add("George", 36) Case 3 : Dictionary3.Add("George", 36) Case 4 : Dictionary4.Add("George", 36) Case 5 : Dictionary5.Add("George", 36) End Select Next End Sub
优化建议
- 给项目开启
Option Strict On配置,关闭隐式自动类型转换,强制编写代码时做明确的类型匹配,从根源上避免类型不匹配导致的运行时异常,也能提升代码运行性能。 - 所有需要批量处理同类型对象的场景,都优先用数组、List、Dictionary这类集合结构存储,不要试图通过拼接变量名的方式动态访问变量,这种逻辑在静态编译语言中本身就不成立。
内容的提问来源于stack exchange,提问作者Dr. Code
相关产品推荐
相关产品推荐

