Option Strict 语句

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

语法

Option Strict { On | Off }

部件

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

注解

在文件中出现或Option Strict出现时Option Strict On,以下条件会导致编译时错误:

  • 隐式缩小转换

  • 后期绑定

  • 导致 Object 类型的隐式键入

注释

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

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

如果使用,则必须在 Option Strict 文件中的任何其他代码语句之前显示该语句。

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

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

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

  • 它加快代码的执行速度。 原因之一是,如果未为编程元素指定数据类型,Visual Basic 编译器会为其分配类型 Object 。 编译的代码可能需要在其他数据类型之间 Object 来回转换,从而降低性能。

隐式缩小转换错误

当存在隐式数据类型转换是缩小转换时,会发生隐式缩小转换错误。

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

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

使用 & 运算符连接字符串时,所有到字符串的转换都被视为扩大。 因此,即使打开, Option Strict 这些转换也不会生成隐式缩小转换错误。

调用具有与相应参数不同的数据类型的参数的方法时,缩小转换会导致编译时错误(如果 Option Strict 启用)。 可以使用扩大转换或显式转换来避免编译时错误。

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

后期绑定错误

当对象被赋给声明为 Object类型的变量的属性或方法时,该对象将延迟绑定。 有关详细信息,请参阅 早期绑定和后期绑定

隐式对象类型错误

如果无法推断声明变量的相应类型,则会发生隐式对象类型错误,因此推断出 Object 类型。 这主要发生在使用 Dim 语句声明变量而不使用 As 子句,并且 Option Infer 处于关闭状态时。 有关详细信息,请参阅 Option Infer 语句Visual Basic 语言规范

对于方法参数,如果Option Strict处于关闭状态,则As子句是可选的。 但是,如果有一个 As 参数使用子句,它们都必须使用它。 如果 Option Strict 为 on,则每个参数定义都需要该 As 子句。

如果在不使用子句的情况下 声明变量并将其设置为, 则变量的类型为 < a0/>。 在这种情况下,当处于打开和Option Infer打开时Option Strict,不会发生编译时错误。 下面是一 Dim something = Nothing个示例。

默认数据类型和值

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

指定的数据类型? 指定的初始值设定项? 示例: 结果
Dim qty 如果 Option Strict 为 off(默认值),则变量设置为 Nothing

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

如果Option Infer已关闭且Option Strict关闭,则变量采用数据类型。Object

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

当 Option Strict 语句不存在时

如果源代码不包含Option Strict语句,则使用编译页上的选项严格设置(Visual Basic)。 编译页具有设置,可对生成错误的条件提供其他控制。

如果使用命令行编译器,可以使用 -optionstrict 编译器选项指定设置 Option Strict

在 IDE 中设置 Option Strict

注释

计算机可能会在以下说明中显示某些 Visual Studio 用户界面元素的不同名称或位置。 你拥有的 Visual Studio 版本以及所使用的设置决定了这些元素。 有关更多信息,请参阅 自定义 IDE

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

  2. 在“ 编译 ”选项卡上,在 “选项严格 ”框中设置值。

在 IDE 中设置警告配置

使用 编译页、项目设计器(Visual Basic) 而不是 Option Strict 语句时,可以更好地控制生成错误的条件。 编译页“警告配置”部分的设置对应于导致编译时错误的Option Strict三个条件。 以下是以下设置:

  • 隐式转换

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

  • 隐式类型;对象假定为

将“选项严格” 设置为 on时,这三个警告配置设置都设置为 错误。 将选项严格 设置为 关闭时,所有三个设置都设置为“无”

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

为新项目设置 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

另请参阅