本地类型推理 (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 = 3 或这样的 Dim num4 As Double = 3声明来指定另一种类型。

注释

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

本地类型推理适用于过程级别。 它不能用于在模块级别声明变量(在类、结构、模块或接口内,但不在过程或块内)。 如果在上一示例中,num2 是类的字段而不是过程中的局部变量,那么在 Option Strict 开启时,声明会导致错误,而在 num2 关闭时,它会将 Object 分类为 Option Strict。 同样,局部类型推理不适用于声明为 Static的过程级别变量。

类型推理与后期绑定

使用类型推理的代码类似于依赖于后期绑定的代码。 但是,类型推理将强类型化变量,而不是将其保留为 Object。 编译器使用变量的初始值设定项在编译时确定变量的类型,以生成早期绑定的代码。 在前面的示例中,num2num1 一样,其类型为 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)

另请参阅