【问题标题】:VB6 to VB.NET Visual Studio Upgrade Wizard hates some of my variable namesVB6 到 VB.NET Visual Studio 升级向导讨厌我的一些变量名
【发布时间】:2025-12-27 16:05:17
【问题描述】:

我正在使用升级向导将 VB6 项目升级到 VB.NET。我知道这会让我很伤心,但我正在努力使旧应用程序可用。如果我有时间,我会重写它,但我目前正在完成一份暑期实习,并且想要一些工作。

向导正在做的一件我找不到任何理由的事情是重命名随机变量。例如:

Structure ctrObj
    Dim Name As String
    Dim Index As Integer
    Dim Top As Integer
    'UPGRADE_NOTE: Left was upgraded to Left_Renamed. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A9E4979A-37FA-4718-9994-97DD76ED70A7"'
    Dim Left_Renamed As Integer
    Dim Height As Integer
    Dim width As Integer
    Dim ScaleHeight As Integer
    Dim ScaleWidth As Integer
End Structure

对于我的一生,我不明白为什么这会改变。据我所知,它不是保留名称,在范围内我找不到其他名为 left 的变量,重命名它不会产生编译器错误。

'UPGRADE_NOTE: Left was upgraded to Left_Renamed. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="A9E4979A-37FA-4718-9994-97DD76ED70A7"'
    Dim Left_Renamed As Integer

改为

Dim Left As Integer

不会给出编译器错误。

它对整个项目中看似随机的变量执行此操作。有人知道为什么它不喜欢我的一些变量名吗?

【问题讨论】:

  • 来自文档:“在某些情况下,必须重命名变量,因为原始名称与保留字冲突。例如,名为 Day 的变量将重命名为 Day_Renamed;Day 不是保留的Visual Basic 6.0 中的名称,但它是 Visual Basic 2008 中的名称。"

标签: vb.net visual-studio vb6-migration


【解决方案1】:

我最好的猜测是它正在重命名 Left 以避免与 VB 函数 Left 混淆。这是命名空间中模块上的一种方法,默认导入到每个 VB.Net 项目中。因此,它是全球可用的。

例如:这样编译就好了

Dim x = Left("here", 1)

如果在没有参数的情况下使用该函数,可能会出现歧义错误。例如

Public Structure S1
  Public Left As Integer
  Public Sub Method1()
    Dim x = Left
  End Sub
End Structure

但是,由于几个原因,这不可能发生。主要是 VB 的名称绑定规则将优先使用成员变量 Left 而非 Module Function Left。

因此,不完全确定原因,但避免潜在的歧义可能过于谨慎。

【讨论】:

  • 有道理,虽然这很烦人。它还使用一个名为 logger 的变量来执行此操作——是否有一些名为 Logger 的默认导入方法?
【解决方案2】:

Left 是 Visual Basic 中的字符串函数。它从字符串左侧获取指定数量的字符并返回包含这些字符的新字符串。

【讨论】:

    【解决方案3】:

    VB6 x$ = left$("hello world",5) 打印 x$ 你好

    VB2005,8,9 与 VB6

     left = left$
     right = right$
     mid   = mid$
     trim  = trim$
     chr(13)+chr(10) = Chr$(32)+ Chr$(10) (line feed + carriage return)
    

    left 是保留字,会产生错误,因此转换程序会以您知道已更改的方式对其进行更改。

    【讨论】: