將隱含數據類型轉換限制為只擴大轉換、不允許晚期系結,以及不允許產生 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 Strict 為 On時,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 Infer時Option 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。
在 [方案總管] 中,選取專案。 按一下 [專案] 功能表上的 [屬性]。
在 [ 編譯] 索引標籤上,於 [ 選項嚴格 ] 方塊中設定值。
在 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