Long

將隱含資料類型轉換僅限於擴展轉換,而且不允許晚期繫結及產生 Object 類型的隱含類型。

語法

Option Strict { On | Off }

組件

詞彙 定義
On 選擇性。 啟用 Option Strict 檢查。
Off 選擇性。 停用 Option Strict 檢查。

備註

Option Strict OnOption Strict 出現在檔案中時,下列情況會造成編譯時期錯誤:

  • 隱含縮小轉換

  • 晚期繫結

  • 導致 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 已設為關閉的時候。 如需詳細資訊,請參閱 Option Infer 陳述式Visual Basic 語言規格

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

若您在不使用 As 子句的情況下宣告變數,並將其設為 Nothing,則變數的類型為 Object。 當 Option StrictOption Infer 都開啟時,在這種情況下不會發生編譯時錯誤。 這種情況的一個例子是 Dim something = Nothing

預設資料類型和值

下表說明在 Dim 陳述式中指定資料類型和初始設定式的各種組合結果。

指定了資料類型? 指定了初始設定式? 範例 結果
No Dim qty 如果 Option Strict 已關閉 (預設值),此變數會設定為 Nothing

如果 Option Strict 已開啟,就會發生編譯時間錯誤。
No Yes Dim qty = 5 如果 Option Infer 已開啟 (預設值),此變數會採用初始設定式的資料類型。 請參閱區域類型推斷

如果 Option Infer 已關閉,且 Option Strict 也已關閉,此變數會採用 Object 的資料類型。

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

Option Strict 陳述式不存在時

如果原始程式碼未包含 Option Strict 陳述式,則會使用 「專案設計工具 (Visual Basic)」的「編譯」頁面上的 Option strict 設定。 編譯頁面具有可提供對產生錯誤的情況進行其他控制的設定。

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

若要在 IDE 中設定 Option Strict

注意

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

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

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

若要在 IDE 中設定警告組態

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

  • 隱含轉換

  • 晚期繫結,執行階段時呼叫可能失敗

  • 隱含類型,假設是 Object

當您將 [Option Strict] 設定為 [On] 時,這三個警告組態設定都會設定為 [錯誤]。 當您將 [Option Strict] 設定為 [Off] 時,所有三個設定都會設定為 [無]

您可以將每個警告組態個別變更為 [無]、[警告] 或 [錯誤]。 如果三個警告組態設定皆設為 [錯誤]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

另請參閱