Option Strict Statement

将隐式数据类型转换限制为仅进行扩大转换,禁止后期绑定,并且禁止导致 Object 类型的隐式类型化。

语法

Option Strict { On | Off }

组成部分

术语 定义
On 可选。 启用 Option Strict 检查。
Off 可选。 禁用 Option Strict 检查。

注解

Option Strict OnOption Strict 出现在文件中时,以下情况会导致编译时错误:

  • 隐式收缩转换

  • 后期绑定

  • 隐式键入会导致 Object 类型

注意

在你可以在编译页面、项目设计器 (Visual Basic) 上设置的警告配置中,有三个设置对应于导致编译时错误的三个条件。 有关如何使用这些设置的信息,请参阅本主题后面的在 IDE 中设置警告配置

Option Strict Off 语句关闭所有三个条件的错误和警告检查,即使相关的 IDE 设置指定打开这些错误或警告。 Option Strict On 语句打开所有三个条件的错误和警告检查,即使相关的 IDE 设置指定关闭这些错误或警告。

使用时,Option Strict 语句必须在文件中任何其他源代码语句之前。

Option Strict 设置为 On 时,Visual Basic 会检查是否为所有编程元素指定了数据类型。 可以显式指定数据类型,也可以使用本地类型推断指定数据类型。 建议为所有编程元素指定数据类型,原因如下:

  • 它为变量和参数启用 IntelliSense 支持。 这样,你就可以在键入代码时查看代码属性和其他成员。

  • 这使编译器能够执行类型检查。 类型检查可帮助你找到由于类型转换错误而可能在运行时失败的语句。 它还标识对不支持这些方法的对象的方法的调用。

  • 它加快了代码的执行速度。 这样做的一个原因是,如果你没有为编程元素指定数据类型,Visual Basic 编译器会为其分配 Object 类型。 编译后的代码可能必须在 Object 和其他数据类型之间来回转换,这会降低性能。

隐式收缩转换错误

隐式数据类型转换为收缩转换时,将发生隐式收缩转换错误。

Visual Basic 可以将许多数据类型转换为其他数据类型。 如果一种数据类型的值转换为精度较低或容量较小的数据类型,则会发生数据丢失。 如果此类收缩转换失败,则会发生运行时错误。 Option Strict 确保这些收缩转换的编译时通知,以便你可以避免收缩转换。 有关详细信息,请参阅隐式转换和显式转换扩大转换和收缩转换

可能导致错误的转换包括表达式中发生的隐式转换。 有关详细信息,请参阅下列主题:

当你使用 & 运算符连接字符串时,所有对字符串的转换都被认为是扩大的。 所以这些转换不会产生隐式收缩转换错误,即使开启了 Option Strict

当你调用具有与相应参数不同的数据类型的参数的方法时,如果 Option Strict 打开,则收缩转换会导致编译时错误。 你可以通过使用扩大转换或显式转换来避免编译时错误。

对于从 For Each…Next 集合中的元素到循环控制变量的转换,在编译时会抑制隐式收缩转换错误。 即使开启了 Option Strict 也会发生这种情况。 有关详细信息,请参阅关于 Each...Next 语句的“收缩转换”一节。

后期绑定错误

如果将对象分配给声明为 Object 类型的变量,则该对象为晚期绑定。 有关详细信息,请参阅早期绑定和后期绑定

隐式对象类型错误

如果无法为已声明的变量推断出合适的类型,则会发生隐式对象类型错误,因此 Object 类型是推断出来的。 这主要是在未使用 As 子句的情况下使用 Dim 语句声明变量,且 Option Infer 为关闭时发生的。 有关详细信息,请参阅 Option Strict 语句Visual Basic 语言规范

对于方法参数,如果 Option Strict 关闭,则 As 子句是可选的。 但是,如果任何一个参数使用 As 子句,它们都必须使用它。 如果开启了 Option Strict,则每个参数定义都需要 As 子句。

如果在未使用 As 子句的情况下声明变量,并且将变量设置为 Nothing,则变量的类型为 Object。 在这种情况下,如果已打开 Option Strict 并打开 Option Infer,则不会发生编译时错误。 此类别的一个示例就是 Dim something = Nothing

默认数据类型和值

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

是否指定数据类型? 是否指定初始值设定项? 示例 结果
Dim qty 如果 Option Strict 处于关闭状态(默认),则将变量设置为 Nothing

如果 Option Strict 处于打开状态,则发生编译时错误。
Dim qty = 5 如果 Option Infer 处于打开状态(默认),则变量采用初始值设定项的数据类型。 请参阅局部类型推理

如果 Option InferOption Strict 均处于关闭状态,则变量采用 Object 的数据类型。

如果 Option Infer 处于关闭状态但 Option Strict 处于打开状态,则发生编译时错误。
Dim qty As Integer 将变量初始化为数据类型的默认值。 有关详细信息,请参阅 Dim 语句
Dim qty As Integer = 5 如果初始值设定项的数据类型不可转换为指定数据类型,则会发生编译时错误。

当 Option Infer 语句不存在时

如果源代码不包含 Option Strict 语句,则使用编译页面,项目设计器 (Visual Basic) 的编译页 上的 Option Strict 设置。 编译页面的设置可以对产生错误的条件提供额外的控制。

如果你使用的是命令行编译器,则可以使用 -optionstrict 编译器选项来指定 Option Strict 的设置。

在 IDE 中设置 Option Strict

注意

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化设置 IDE

  1. 在“解决方案资源管理器”中,选择一个项目。 在 “项目” 菜单上,单击 “属性”

  2. 在“编译”选项卡上,设置 Option Strict 框中的值。

在 IDE 中设置警告配置

如果你使用编译页面、项目设计器 (Visual Basic) 而不是 Option Strict 语句时,你可以额外控制生成错误的条件。 “编译”页的“警告配置”部分具有与 Option Strict 开启时引起编译时错误的三种情况相对应的设置。 这些设置如下:

  • 隐式转换

  • 晚期绑定;调用可能在运行时失败

  • 隐式类型;假定为对象

“Option Strict”设置为“开启”时,所有这三个警告配置设置都将被设置为“错误”。 “Option Strict”设置为“关闭”时,所有这三个设置都将被设置为“无”

可单独将各个警告配置设置更改为“无”、“警告”或“错误”。 如果三个警告配置都设置为“错误”,则 On 会出现在 Option strict 框中。 如果三个都设置为“无”,则 Off 会出现在此框中。 对于这些配置的任何其他组合,显示“(自定义)”

为新项目设置 Option Strict 默认设置

创建项目时,将“编译”选项卡上的“Option Strict”设置设置为“选项”对话框中的“Option Strict”设置。

要在此对话框中设置 Option Strict,请在“工具”菜单上,单击“选项”。 在“选项”对话框中,展开“项目和解决方案”,然后单击“VB 默认值”。 “VB 默认值”中的初始默认设置为 Off

若要设置命令行上的 Option Strict

vbc 命令中包含 -optionstrict 编译器选项。

示例 1

以下示例演示了由收缩转换的隐式类型转换引起的编译时错误。 此类错误对应于“编译页面”上的“隐式转换”条件。

' If Option Strict is on, this implicit narrowing
' conversion causes a compile-time error.
' The commented statements below use explicit
' conversions to avoid a compile-time error.
Dim cyclists As Long = 5
Dim bicycles As Integer = cyclists
'Dim bicycles As Integer = CType(cyclists, Integer)
'Dim bicycles As Integer = CInt(cyclists)
'Dim bicycles As Integer = Convert.ToInt32(cyclists)


' If Option Strict is on, this implicit narrowing
' conversion causes a compile-time error.
' The commented statements below use explicit
' conversions to avoid a compile-time error.
Dim charVal As Char = "a"
'Dim charVal As Char = "a"c
'Dim charVal As Char = CType("a", Char)


' If Option Strict is on, a compile-time error occurs.
' If Option Strict is off, the string is implicitly converted
' to a Double, and then is added to the other number.
Dim myAge As Integer = "34" + 6


' If Option Strict is on, a compile-time error occurs.
' If Option Strict is off, the floating-point number
' is implicitly converted to a Long.
Dim num = 123.45 \ 10

示例 2

下面的示例演示了后期绑定导致的编译时错误。 此类错误对应于“编译页面”上的“后期绑定;调用可能在运行时失败”条件。

' If Option Strict is on, this late binding
' causes a compile-time error. If Option Strict
' is off, the late binding instead causes a
' run-time error.
Dim punchCard As New Object
punchCard.Column = 5

示例 3

以下示例演示了由使用隐式类型 Object 声明的变量引起的错误。 此类错误对应于“编译页面”上的“隐式类型;假定的对象”条件。

' If Option Strict is on and Option Infer is off,
' this Dim statement without an As clause 
' causes a compile-time error.
Dim cardReaders = 5

' If Option Strict is on, a compile-time error occurs.
' If Option Strict is off, the variable is set to Nothing.
Dim dryWall
' If Option Strict is on, this parameter without an
' As clause causes a compile-time error.
Private Sub DetectIntergalacticRange(ByVal photonAttenuation)

End Sub

另请参阅