Option Strict Statement

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

语法

Option Strict { On | Off }

组成部分

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

备注

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

  • 隐式收缩转换

  • 后期绑定

  • 隐式键入会导致 Object 类型

备注

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

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

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

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

  • 它支持变量和参数的 IntelliSense。 这使你能够在键入代码时查看其属性和其他成员。

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

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

隐式收缩转换错误

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

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

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

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

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

对于从集合中的元素到循环控件变量的转换,在编译时禁止隐式 For Each…Next 收缩转换错误。 即使已打开, Option Strict 也会出现此情况。 有关详细信息,请参阅 For Each... 中的"收缩 转换"部分。下一语句

后期绑定错误

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

隐式对象类型错误

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

对于方法参数,如果 为 As off, Option Strict 则 子句是可选的。 但是,如果任何一个参数都 As 使用 子句,则所有参数都必须使用它。 如果 Option Strict 为 on, As 则每个参数定义都需要 子句。

如果在未使用 子句的情况下声明变量 As ,并且将变量设置为 Nothing ,则变量的类型为 Object 。 如果 为 on 且 已打开,则 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 Strict 语句不存在时

如果源代码不包含 语句,则使用"编译"页上的"选项严格"设置 Option Strict Project设计器 (Visual Basic) 设计器。 编译 具有设置,这些设置可进一步控制生成错误的条件。

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

在 IDE 中设置 Option Strict

备注

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

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

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

在 IDE 中设置警告配置

使用编译页时,Project设计器 (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

另请参阅