共用方式為


Option Strict 陳述式

限制隱含資料類型轉換,只擴大轉換,不允許後期繫結,也不允許導致 Object類型的隱含類型化。

Option Strict { On | Off }

組件

詞彙

定義

On

選擇項。 啟用 Option Strict 檢查。

Off

選擇項。 停用 Option Strict 檢查。

備註

當 Option Strict On 或 Option Strict 在檔案中出現時,下列情況將造成編譯時期錯誤:

  • 隱含 Narrowing 轉換

  • 晚期繫結

  • 造成 Object類型的隱含類型化

注意事項注意事項

在您可以於 專案設計工具、編譯頁 (Visual Basic) 設定的警告組態中,有三種設定對應三個條件,會導致編譯時期錯誤。如需關於如何使用這些設定的資訊,請參閱本主題後續的To set warning configurations in the IDE

Option Strict Off 陳述式會關閉全部三個條件的錯誤和警告檢查,即使相關聯的 IDE 設定指定要開啟這些錯誤或警告,也是如此。 Option Strict On陳述式開啟錯誤及警告檢查所有的三個條件,即使相關聯的 IDE 設定可指定要關閉這些錯誤或警告。

如果使用,則 Option Strict 陳述式必須出現在檔案中的任何其他程式碼陳述式之前。

當您設定Option Strict到On,Visual Basic檢查資料型別所指定的所有程式設計項目。 指定明確的或是使用區域別推斷來指定資料型別。 指定的所有程式設計項目資料型別建議,原因如下:

  • 讓 IntelliSense 能夠支援變數和參數。 這能讓您在輸入程式碼時看到其屬性及其他成員。

  • 讓編譯器能夠執行型別檢查。 型別檢查將協助您找到可能會在執行階段因為型別轉換錯誤而失敗的陳述式。 這也能夠識別在不支援這些方法的物件上所進行的方法呼叫。

  • 它能加速程式碼執行。 一個理由是如果您未指定資料類型程式設計項目的,Visual Basic的編譯器將Object型別。 已編譯的程式碼可能要轉換前或往後之間Object及其他資料型別,這會降低效能。

隱含 Narrowing 轉換錯誤

隱含資料類型轉換是 Narrowing 轉換時,會發生隱含 Narrowing 轉換錯誤。

Visual Basic 可以將許多資料型別轉換為其他資料型別。 當某個資料型別的值轉換為精確度較差或容量較小的資料型別時,可能會發生資料流失。 如果這類「縮小轉換」 失敗,就會發生執行階段錯誤。 Option Strict 確保這些縮小轉換的編譯時期通知,這樣即可避免這些轉換。 如需詳細資訊,請參閱 隱含和明確轉換 (Visual Basic)擴展和縮小轉換 (Visual Basic)

可能導致錯誤的轉換包括發生於在運算式中的隱含轉換。 如需詳細資訊,請參閱下列主題:

當您使用 & 運算子 (Visual Basic) 串連字串時,對字串的所有轉換都被視為擴展轉換。 因此,這些轉換不會產生隱含 Narrowing 轉換錯誤,即使開啟 Option Strict 也一樣。

當您呼叫引數資料型別與對應參數不同的方法時,如果 Option Strict 為開啟狀態,則縮小轉換會造成編譯時期錯誤。 您可以使用擴展轉換或明確轉換,避免編譯時期錯誤。

從 For Each…Next 集合中的項目轉換至迴圈控制變數時,會在轉換編譯時隱藏 Narrowing 轉換錯誤。 即使 Option Strict 為開啟狀態,還是會發生這種情況。 如需詳細資訊,請參閱For Each...Next 陳述式 (Visual Basic)中的〈Narrowing 轉換〉一節。

後期繫結錯誤

物件被指派給宣告類型為 Object 之變數的屬性或方法時,為晚期繫結物件。 如需詳細資訊,請參閱 早期和晚期繫結 (Visual Basic)

隱含物件類型錯誤

無法推斷宣告變數的適當類型,因此推斷Object類型時,會發生隱含物件類型錯誤。 這主要是發生在您使用 Dim 陳述式宣告變數而未使用 As 子句,並且 Option Infer 已設為關閉的時候。 如需詳細資訊,請參閱Option Infer 陳述式Visual Basic 語言規格

若為方法參數,如果 Option Strict 是 off,則 As 子句是選擇性的。 然而,如果任一參數會使用 As 子句,則所有參數就必須使用它。 如果Option Strict 是 on,則每個參數定義都要有 As子句。

如果您宣告變數而未使用As子句,並且將其設定為Nothing,則該變數的類型會是Object. Option Strict 和Option Infer皆為 on 時,沒有發生編譯時期錯誤。 其中一個範例是Dim something = Nothing。

zcd4xwzs.collapse_all(zh-tw,VS.110).gif預設資料型別及值

下表說明各種在 Dim 陳述式 (Visual Basic) 中指定資料型別與初始設定式之組合的結果。

資料型別已指定?

是否已指定初始設定式?

範例

結果

Dim qty

如果 Option Strict 關閉 (預設值),則變數會設定為 Nothing。

如果 Option Strict 開啟,則會發生編譯時期錯誤。

Dim qty = 5

如果 Option Infer 開啟 (預設值),則變數會使用初始設定式的資料型別。 請參閱 區域型別推斷 (Visual Basic)

如果 Option Infer 關閉且 Option Strict 關閉,則變數會使用 Object 的資料型別。

如果 Option Infer 關閉而 Option Strict 開啟,則會發生編譯時期錯誤。

Dim qty As Integer

變數會初始化為資料型別的預設值。 如需詳細資訊,請參閱 Dim 陳述式 (Visual Basic)

Dim qty As Integer = 5

如果初始設定式的資料型別無法轉換為指定的資料型別,就會發生編譯時期錯誤。

當 Option Strict 陳述式不存在時

如果原始程式碼不包含 Option Strict 陳述式,則會使用 專案設計工具、編譯頁 (Visual Basic) 上的 [Option Strict] 設定。 [編譯頁] 含有的設定可在產生錯誤的條件之外提供其他控制項。

如果您使用命令列編譯器,則可以使用/optionstrict編譯器選項指定Option Strict的設定。

zcd4xwzs.collapse_all(zh-tw,VS.110).gif若要在 IDE 中設定 Option Strict

注意事項注意事項

您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱 Visual Studio 設定

  1. 在 [方案總管] 中選取專案。 在 [專案] 功能表上,按一下 [屬性]。 如需詳細資訊,請參閱專案設計工具簡介

  2. 在 [編譯] 索引標籤上,設定 [Option Strict] 方塊中的值。

zcd4xwzs.collapse_all(zh-tw,VS.110).gif若要在 IDE 中設定警告組態

當您使用專案設計工具、編譯頁 (Visual Basic) 而不是 Option Strict 陳述式時,您也可以對產生錯誤的條件進行其他控制。 [編譯] 頁的 [警告組態] 區段中所包含的設定對應三個會在 Option Strict 設為開啟時導致編譯時期錯誤的條件。 以下是這些設定:

  • 隱含轉換

  • 後期繫結;叫用可能會在執行階段失敗

  • 隱含類型;假定物件

當您將 [Option Strict] 設定為 [開啟] 時,這三個警告組態設定都會設定為 [錯誤]。 當您將 [Option Strict] 設定為 [關閉] 時,所有三個設定都會設定為 []。

您可以將每個警告組態個別變更為 []、[警告] 或 [錯誤]。 如果三個警告組態設定皆設為 [錯誤],On會出現在Option strict方塊中。 如果三個都設為 [],此方塊中會出現 Off。 若為這些設定的其他任何組合,會出現 [(自訂)]。

zcd4xwzs.collapse_all(zh-tw,VS.110).gif若要設定新專案的 Option Strict 預設設定

當您建立專案時,[編譯] 索引標籤上的 [Option Strict] 設定會設定為 [選項] 對話方塊中的 [Option Strict] 設定。

若要在這個對話方塊中設定 Option Strict,請按一下 [工具] 功能表上的 [選項]。 在 [選項] 對話方塊中,展開 [專案和方案],然後按一下 [VB 預設值]。 [VB 預設值] 中的初始預設設定是 Off。

zcd4xwzs.collapse_all(zh-tw,VS.110).gif若要在命令列上設定 Option Strict

vbc 命令中包含 /optionstrict 編譯器選項。

範例

下列範例示範縮小轉換的隱含型別轉換所造成的編譯時期錯誤。 這個錯誤分類對應至 [編譯] 頁上的 [隱含轉換] 條件。

' 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

下列範例示範晚期繫結造成的編譯時期錯誤。 這個錯誤分類對應至 [編譯] 頁上的 [晚期繫結,執行階段時呼叫可能失敗] 條件。

' 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

下列範例示範由 Object 隱含型別宣告的變數所造成的錯誤。 這個錯誤分類對應至 [編譯] 頁上的 [隱含型別,假設是 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

請參閱

工作

HOW TO:存取物件的成員 (Visual Basic)

參考

專案設計工具、編譯頁 (Visual Basic)

Option Explicit 陳述式 (Visual Basic)

型別轉換函式 (Visual Basic)

/optionstrict

選項對話方塊、專案、Visual Basic 預設值

概念

擴展和縮小轉換 (Visual Basic)

隱含和明確轉換 (Visual Basic)

XML 中內嵌的運算式 (Visual Basic)

寬鬆委派轉換 (Visual Basic)

Office 方案中的晚期繫結