共用方式為


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 關閉時。 如需詳細資訊,請參閱 OptionInfer語句Visual Basic語言規格

對於方法參數,如果 Option Strict 關閉,子As句是選擇性的。 不過,如果有一個 As 參數使用 子句,則所有參數都必須使用它。 如果 Option Strict 為 開啟, As 則每個參數定義都需要 子句。

如果您在不使用 子句的情況下 As 宣告變數,並將其設定為 Nothing,則變數的類型為 Object。 當 處於 且 開啟Option InferOption Strict,就不會發生編譯時間錯誤。 其中一個範例是 Dim something = Nothing

默認數據類型和值

下表描述 在 Dim 語句中指定數據類型和初始化表達式的各種組合結果。

指定的數據類型? 指定的初始化表達式? 範例 結果
Dim qty 如果 Option Strict 為 off (預設值),變數會設定為 Nothing

如果 Option Strict 為 開啟,就會發生編譯時期錯誤。
是的 Dim qty = 5 如果 Option Infer 為 on (預設值),變數會採用初始化表達式的數據類型。 請參閱 本機類型推斷

如果 Option Infer 為 off 且 Option Strict 為 off,則變數會採用 的 Object數據類型。

如果 Option Infer 已關閉且 Option Strict 開啟,則會發生編譯時間錯誤。
是的 Dim qty As Integer 變數會初始化為數據類型的預設值。 如需詳細資訊,請參閱 Dim 語句
是的 是的 Dim qty As Integer = 5 如果初始化表達式的數據類型無法轉換成指定的數據類型,就會發生編譯時期錯誤。

當Option Strict語句不存在時

如果原始程式碼不包含 Option Strict 語句,則會使用編譯頁面、項目設計工具 (Visual Basic) 上的 Option strict 設定。 編譯 頁面 具有設定,可提供對產生錯誤之條件的額外控制。

如果您使用命令行編譯程式,您可以使用 -optionstrict 編譯程式選項來指定 的 Option Strict設定。

在 IDE 中設定 Option Strict

備註

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

  1. 在 [方案總管] 中,選取專案。 按一下 [專案] 功能表上的 [屬性]

  2. 在 [ 編譯] 索引標籤上,於 [ 選項嚴格 ] 方塊中設定值。

在 IDE 中設定警告組態

當您使用 編譯頁面、項目設計工具 (Visual Basic) 而不是 Option Strict 語句時,您可以額外控制產生錯誤的條件。 [編譯頁面] 的 [警告組態] 區段具有對應至開啟時造成編譯時間錯誤的Option Strict三個條件的設定。 以下是這些設定:

  • 隱含轉換

  • 晚期系結;呼叫可能會在運行時間失敗

  • 隱含類型;假設的物件

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

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

若要為新項目設定 [選項嚴格] 預設設定

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

若要在此對話框中設定 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

另請參閱