共用方式為


Option Infer 語句

可讓您在宣告變數時使用局部類型推斷。

語法

Option Infer { On | Off }

組件

術語 定義
On 選擇性。 啟用本機類型推斷。
Off 選擇性。 停用本機類型推斷。

備註

若要在檔案中設定 Option Infer ,請在任何其他原始程式碼之前輸入 Option Infer OnOption Infer Off 檔案頂端。 如果檔案中設定 Option Infer 的值與 IDE 或命令行中設定的值發生衝突,則檔案中的值具有優先順序。

當您將 設定 Option InferOn時,可以宣告局部變數,而不明確指出數據類型。 編譯程式會從其初始化表達式的類型推斷變數的數據類型。

在下圖中, Option Infer 已開啟。 宣告 Dim someVar = 2 中的變數會依類型推斷宣告為整數。

下列螢幕快照顯示 [選項推斷] 開啟時 IntelliSense:

顯示 [選項推斷] 開啟時 IntelliSense 檢視的螢幕快照。

在下圖中, Option Infer 已關閉。 宣告 Dim someVar = 2 中的變數會依類型推斷宣告為 Object 。 在此範例中,[選項嚴格] 設定會設定為 [編譯頁面]、[項目設計工具] [Visual Basic] 上的 [關閉]。

下列螢幕快照顯示 [選項推斷] 關閉時的 IntelliSense:

顯示 [選項推斷] 關閉時 IntelliSense 檢視的螢幕快照。

備註

當變數宣告為 Object時,運行時間類型可以在程式執行時變更。 Visual Basic 會執行稱為 Boxingunboxing 的作業,以在 和 實值型別之間進行 Object 轉換,讓執行速度變慢。 如需 Boxing 和 unboxing 的相關信息,請參閱 Visual Basic 語言規格

類型推斷會在程式層級套用,而且不適用於類別、結構、模組或介面中的程式外部。

如需詳細資訊,請參閱 本機類型推斷

當選項推斷語句不存在時

如果原始程式碼不包含 Option Infer 語句,則會使用編譯頁面、項目設計工具 (Visual Basic) 上的 Option Infer 設定。 如果使用命令行編譯程式,則會使用 -optioninfer 編譯程序選項。

在 IDE 中設定 Option Infer

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

  2. 按一下 [編譯] 索引標籤。

  3. 在 [ 選項推斷 ] 方塊中設定值。

當您建立新的專案時,[編譯] 索引標籤上的 [選項推斷] 設定會設定為 [VB 預設值] 對話框中的 [選項推斷] 設定。 若要存取 [VB 預設值 ] 對話框,請單擊 [ 工具] 功能表上的 [ 選項]。 在 [ 選項 ] 對話框中,展開 [ 專案和方案],然後按兩下 [VB 預設值]。 VB 預設值中的初始預設設定為 On

在命令行上設定選項推斷

vbc 命令中包含 -optioninfer 編譯程序選項。

默認數據類型和值

下表描述在語句中 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 如果初始化表達式的數據類型無法轉換成指定的數據類型,就會發生編譯時期錯誤。

範例 1

下列範例示範 語句如何 Option Infer 啟用本機類型推斷。

' Enable Option Infer before trying these examples.

' Variable num is an Integer.
Dim num = 5

' Variable dbl is a Double.
Dim dbl = 4.113

' Variable str is a String.
Dim str = "abc"

' Variable pList is an array of Process objects.
Dim pList = Process.GetProcesses()

' Variable i is an Integer.
For i = 1 To 10
    Console.WriteLine(i)
Next

' Variable item is a string.
Dim lst As New List(Of String) From {"abc", "def", "ghi"}

For Each item In lst
    Console.WriteLine(item)
Next

' Variable namedCust is an instance of the Customer class.
Dim namedCust = New Customer With {.Name = "Blue Yonder Airlines",
                                   .City = "Snoqualmie"}

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

' If customers is a collection of Customer objects in the following 
' query, the inferred type of cust is Customer, and the inferred type
' of custs is IEnumerable(Of Customer).
Dim custs = From cust In customers 
            Where cust.City = "Seattle" 
            Select cust.Name, cust.ID

範例 2

下列範例示範當變數識別為 Object時,運行時間類型可能會有所不同。

' Disable Option Infer when trying this example.

Dim someVar = 5
Console.WriteLine(someVar.GetType.ToString)

' If Option Infer is instead enabled, the following
' statement causes a run-time error. This is because
' someVar was implicitly defined as an integer.
someVar = "abc"
Console.WriteLine(someVar.GetType.ToString)

' Output:
'  System.Int32
'  System.String

另請參閱