Option Infer 语句

在变量声明过程中启用局部类型推理。

Option Infer { On | Off }

部件

术语

定义

On

可选。 启用局部类型推理。

Off

可选。 禁用局部类型推理。

备注

若要在文件中设置 Option Infer,则在任何其他源代码之前,在文件顶部键入 Option Infer On 或 Option Infer Off。 如果在文件中为 Option Infer 设置的值与 IDE 或命令行中设置的值发生冲突,则文件中的值优先。

如果将 Option Infer 设置为 On,则在声明局部变量时无需显式声明数据类型。 编译器将根据变量的初始化表达式的类型来推断变量的数据类型。

下图中,Option Infer 将关闭。 在类型推理的情况下,在声明 Dim someVar = 2 中的变量声明为一个整数。

当 Option Infer 为 on 时使用 IntelliSense

声明的 IntelliSense 视图。

下图中,Option Infer 将关闭。 在类型推理的情况下,在声明 Dim someVar = 2 中的变量声明为 Object。 在此示例中,**“Option Strict”**设置在 “项目设计器”->“编译”页 (Visual Basic) 上设置为了 Off

当 Option Infer 为 off 时使用 IntelliSense

声明的 IntelliSense 视图。

备注

当变量被声明为 Object时,程序运行时,可以更改运行时类型。Visual Basic 执行调用装箱和取消装箱操作将 Object 和值类型之间,使执行更慢。有关装箱和取消装箱的信息,请参见Visual Basic 语言规范

类型推断适用于过程级,而在类中的过程、结构、模块或接口之外不适用。

有关更多信息,请参见局部类型推理 (Visual Basic)

当 Option Infer 语句不存在时

如果源代码中不包含 Option Infer 语句,则使用 “项目设计器”->“编译”页 (Visual Basic) 上的**“Option Infer”**设置。 如果使用命令行编译器,则使用 /optioninfer 编译器选项。

在 IDE 中设置 Option Infer

  1. 在**“解决方案资源管理器”中选择一个项目。 在“项目”菜单上,单击“属性”**。 有关更多信息,请参见项目设计器介绍

  2. 单击**“编译”**选项卡。

  3. 在**“Option Infer”**框中设置此值。

当您创建新项目时,编译选项卡上的**“Option Infer”设置将在“VB 默认值”对话框中设为“Option Infer”设置。 若要访问“VB 默认值”对话框,请在“工具”菜单上,单击“选项”。 在“选项”对话框中展开“项目和解决方案”,然后单击“VB 默认值”**。 **“VB 默认值”**中的初始默认值设置为 On。

在命令行中设置 Option Infer

  • /optioninfer 编译器选项包括在 vbc 命令中。

默认数据类型和值

下表描述了在 Dim 语句中指定数据类型和初始值设定项的各种组合的结果。

是否指定数据类型?

是否指定初始值设定项?

示例

结果

Dim qty

如果 Option Strict 为 off(默认),则变量将设置为 Nothing。

如果 Option Strict 为 on,则会发生编译时错误。

Dim qty = 5

如果 Option Infer 为 on(默认),则该变量采用初始值设定项的数据类型。 请参见 局部类型推理 (Visual Basic)

如果 Option Infer 处于关闭状态,并且 Option Strict 处于关闭状态,则该变量采用 Object 数据类型。

如果 Option Infer 为 off,并且 Option Strict 为 on,则会发生编译时错误。

Dim qty As Integer

变量初始化为数据类型的默认值。 有关更多信息,请参见 Dim 语句 (Visual Basic)

Dim qty As Integer = 5

如果初始值设定项的数据类型不能转换为指定的数据类型,将发生编译时错误。

示例

下面的示例演示 Option Infer 语句如何启用局部类型推理。

' Enable Option Infer before trying these examples.

' Variable num is an Integer.
Dim num = 5

' Variable dbl is a Double.
Dim dbl = 4.113

' Variable str is a String.
Dim str = "abc"

' Variable pList is an array of Process objects.
Dim pList = Process.GetProcesses()

' Variable i is an Integer.
For i = 1 To 10
    Console.WriteLine(i)
Next

' Variable item is a string.
Dim lst As New List(Of String) From {"abc", "def", "ghi"}

For Each item In lst
    Console.WriteLine(item)
Next

' Variable namedCust is an instance of the Customer class.
Dim namedCust = New Customer With {.Name = "Blue Yonder Airlines",
                                   .City = "Snoqualmie"}

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

' If customers is a collection of Customer objects in the following 
' query, the inferred type of cust is Customer, and the inferred type
' of custs is IEnumerable(Of Customer).
Dim custs = From cust In customers 
            Where cust.City = "Seattle" 
            Select cust.Name, cust.ID

下面的示例演示,将变量识别为 Object 时,运行时类型可能会有所不同。

' Disable Option Infer when trying this example.

Dim someVar = 5
Console.WriteLine(someVar.GetType.ToString)

' If Option Infer is instead enabled, the following
' statement causes a run-time error. This is because
' someVar was implicitly defined as an integer.
someVar = "abc"
Console.WriteLine(someVar.GetType.ToString)

' Output:
'  System.Int32
'  System.String

请参见

参考

Dim 语句 (Visual Basic)

Option Compare 语句

Option Explicit 语句 (Visual Basic)

Option Strict 语句

“选项”对话框 ->“项目”->“Visual Basic 默认值”

/optioninfer

装箱和取消装箱(C# 编程指南)

概念

局部类型推理 (Visual Basic)