局部类型推理 (Visual Basic)

Visual Basic 编译器使用类型推理来确定在不使用 As 子句的情况下声明的局部变量的数据类型。 编译器将从初始化表达式的类型推理该变量的类型。 这样,无需显式指明类型即可声明变量,如以下示例所示。 在声明后,num1num2 都将强类型化为整数。

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub

注意

如果你不希望将以上示例中的 num2 类型化为 Integer,可以使用类似于 Dim num3 As Object = 3Dim num4 As Double = 3 的声明来指定另一个类型。

注意

类型推理只可用于非静态局部变量;它不可于确定类字段、属性或函数的类型。

局部类型推理在过程级别应用。 它不可用于在模块级别声明变量(可在类、结构、模块或接口中声明,但不可在过程或块中声明)。 如果以上示例中的 num2 是类的字段而不是过程中的局部变量,则声明将导致出错并打开 Option Strict,并将 num2 分类为 Object 并关闭 Option Strict。 同理,局部类型推理不适用于声明为 Static 的过程级变量。

类型推理与后期绑定

使用类型推理的代码类似于依赖后期绑定的代码。 但是,类型推理将强类型化变量,而不是将其保留为 Object。 在编译时,编译器使用变量的初始值设定项来确定变量的类型,以生成前期绑定代码。 在以上示例中,与 num1 一样,num2 将类型化为 Integer

前期绑定变量的行为与后期绑定变量不同,后者的类型仅在运行时才能获知。 提前知道类型使得编译器能够在执行之前识别问题、精确分配内存并执行其他优化。 前期绑定还使 Visual Basic 集成开发环境 (IDE) 能够提供有关对象成员的 IntelliSense 帮助。 前期绑定还有利于提升性能。 这是因为,存储在后期绑定变量中的所有数据都必须包装为类型 Object,而在运行时访问该类型的成员会减慢程序的运行速度。

示例

如果在不使用 As 子句的情况下声明局部变量并初始化,则会发生类型推理。 编译器使用初始赋值的类型作为该变量的类型。 例如,以下每个代码行声明一个类型为 String 的变量。

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

以下代码演示创建整数数组的两种等效方式。

' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}

' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}

使用类型推理可以方便地确定循环控制变量的类型。 在以下代码中,编译器推理出 numberInteger,因为以上示例中的 someNumbers2 是一个整数数组。

Dim total = 0
For Each number In someNumbers2
    total += number
Next

可以在 Using 语句中使用局部类型推理来确定资源名称的类型,如以下示例所示。

Using proc = New System.Diagnostics.Process
    ' Insert code to work with the resource.
End Using

也可以从函数的返回值推理变量的类型,如以下示例所示。 pList1pList2 都是进程数组,因为 Process.GetProcesses 返回进程数组。

' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

Option Infer

使用 Option Infer 可以指定是否允许在特定的文件中进行局部类型推理。 若要启用或阻止该选项,请在该文件的开头键入以下语句之一。

Option Infer On

Option Infer Off

如果未在代码中为 Option Infer 指定值,则编译器默认值为 Option Infer On

如果为文件中 Option Infer 设置的值与在 IDE 中或在命令行上设置的值冲突,则文件中的值优先。

有关详细信息,请参阅 Option Infer 语句项目设计器中的编译页 (Visual Basic)

另请参阅