局部类型推理

更新: 2008 年 7 月

Visual Basic 2008 中的编译器使用类型推理来确定未使用 As 子句声明的局部变量的数据类型。编译器将通过初始化表达式的类型推断出变量的类型。这使您可以声明变量,而无需显式声明类型,如下面的示例中所示。

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub
说明:

局部类型推理不能用于声明类字段。如果上面示例中的 num2 是字段而不是局部变量,则在 Option Strict 打开时该声明会导致错误,而在 Option Strict 关闭时该声明会将 num2 分类为 Object。同样,在 Option Strict 打开时,无法推断出静态变量的类型。在 Option Strict 关闭时,Static staticVar = 5 中的 staticVar 的类型为 Object。

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

早期绑定变量的行为与后期绑定变量的行为不同,只有在运行时才知道后期绑定变量的类型。在早期知道类型,使得编译器可以在执行之前确定问题,准确地分配内存,并且执行其他优化。早期绑定还使 Visual Basic 集成开发环境 (IDE) 可以提供有关对象的成员的 IntelliSense 帮助。早期绑定还可有利于达到更高的性能。这是因为存储在后期绑定变量中的所有数据都必须包装为类型 Object,在运行时访问该类型的成员,会使得程序运行较慢。

说明:

如果不希望前面示例中的 num2 类型化为 Integer,则可以使用声明(如 Dim num3 As Object = 3 或 Dim num4 As Double = 3)指定另一个类型。

示例

当局部变量未使用 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}

使用类型推理可以确定循环控制变量的类型。在下面的代码中,编译器推断出 number 为 Integer,因为 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

还可以从函数的返回值推断变量的类型,如下面的示例所示。pList1 和 pList2 均为进程列表。

' 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 指定值,则对于在 Visual Basic 2008 中创建的项目,编译器的默认值为 Option Infer On,而对于从较早版本升级的项目,编译器的默认值则为 Option Infer Off。有关更多信息,请参见 Option Infer 语句/optioninfer

说明:

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

限制

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

请参见

概念

匿名类型

早期绑定和后期绑定

Visual Basic 中的 LINQ 简介

参考

For Each...Next 语句 (Visual Basic)

For...Next 语句 (Visual Basic)

Option Infer 语句

/optioninfer

修订记录

日期

修订记录

原因

2008 年 7 月

将“示例”一节文本中的循环控制变量的名称从 num 更改为 number,以匹配代码中的名称。

客户反馈。