VB中Dictionary用元组作键编译报错及LangVersion设置问题求助
问题解决方案
一、编译错误的根源与修复
你的代码使用了**值元组(Value Tuple)**作为Dictionary的键,但当前项目的VB语言版本不支持该语法,这直接引发了两个编译错误:
BC30182: Type expected:编译器无法识别(Long, Long, Long)这种值元组类型写法BC30638: Array bounds cannot appear in type specifiers:编译器误将值元组的括号判定为数组边界声明
修复方式有两种:
用自定义结构体替代值元组
若需兼容低语言版本,可定义结构体作为字典键:Structure UploadKey Property A As Long Property B As Long Property C As Long ' 必须重写Equals和GetHashCode,保证Dictionary能正确识别键 Public Overrides Function Equals(obj As Object) As Boolean If TypeOf obj Is UploadKey Then Dim other = DirectCast(obj, UploadKey) Return A = other.A AndAlso B = other.B AndAlso C = other.C End If Return False End Function Public Overrides Function GetHashCode() As Integer Return HashCode.Combine(A, B, C) End Function End Structure ' 声明Dictionary Dim upload As Dictionary(Of UploadKey, Long)强制启用支持值元组的语言版本
值元组在VB 15.3及以上版本才支持,需手动修改项目文件修复LangVersion配置异常:- 右键项目 → 卸载项目 → 右键编辑项目文件
- 在
<PropertyGroup>节点中添加或修改:<LangVersion>16.9</LangVersion> - 保存后重新加载项目,再尝试编译
二、LangVersion设置无效的解决
提示the value 'default' is invalid for option 'langversion'说明项目的MSBuild配置已损坏,可尝试以下操作:
- 删除项目根目录下的
.vs隐藏文件夹(VS的缓存目录,包含项目配置缓存) - 删除
bin和obj文件夹,清理后重新生成项目 - 无需删除AppData下的文件,若之前手动修改过VS全局配置,可重置VS设置:打开VS → 工具 → 导入和导出设置 → 重置所有设置
三、LinqPad与其他VB项目正常的原因
LinqPad默认使用最新VB语言版本,其他正常的VB项目要么已正确配置LangVersion,要么使用了较新的项目模板(如.NET Core/.NET 5+模板,默认启用高语言版本)。而你的当前项目大概率是旧的.NET Framework Web Forms项目(Page_Prerender可佐证),这类项目默认LangVersion较低,且VS界面中可能不显示高版本选项,必须手动修改项目文件。
内容的提问来源于stack exchange,提问作者doctor boo
相关产品推荐
相关产品推荐

