You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB中Dictionary用元组作键编译报错及LangVersion设置问题求助

问题解决方案

一、编译错误的根源与修复

你的代码使用了**值元组(Value Tuple)**作为Dictionary的键,但当前项目的VB语言版本不支持该语法,这直接引发了两个编译错误:

  • BC30182: Type expected:编译器无法识别(Long, Long, Long)这种值元组类型写法
  • BC30638: Array bounds cannot appear in type specifiers:编译器误将值元组的括号判定为数组边界声明

修复方式有两种:

  1. 用自定义结构体替代值元组
    若需兼容低语言版本,可定义结构体作为字典键:

    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)
    
  2. 强制启用支持值元组的语言版本
    值元组在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:50:50