區域型別推斷 (Visual Basic)

Visual Basic 編譯器會使用「型別推斷」(Type Inference) 來判斷未使用 As 子句宣告之區域變數的資料型別。 編譯器是根據初始化運算式的型別推斷變數的型別。 這可以讓您宣告變數而不用明確陳述型別,如同下列範例所示。宣告的結果是,num1 和 num2 都會變成強型別的整數。

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub
注意事項注意事項

如果您不要前述範例中 num2 的型別為 Integer,則可指定其他型別,方法是使用 Dim num3 As Object = 3 或 Dim num4 As Double = 3 之類的宣告。

區域型別推斷適用於程序層次, 不能用在模組層次 (在類別、結構、模組或介面中,但程序和區塊除外) 宣告變數。 如果上一個範例中的 num2 是類別欄位而非程序中的區域變數,則宣告會造成 Option Strict 為 On 的錯誤,並且會將 num2 分類為 Object 且 Option Strict 為 Off。 同樣地,區域型別推斷不適用於宣告為 Static 的程序層級變數。

型別推斷和晚期繫結的比較

使用型別推斷的程式碼,類似於依賴晚期繫結 (Late Binding) 的程式碼。 但是,型別推斷會使變數成為強型別,而不是維持 Object。 編譯器使用變數的初始設定式,在編譯時期判斷變數的型別以產生早期繫結程式碼。 在前述範例中,num2 與 num1 相同,型別都是 Integer。

早期繫結變數的行為與晚期繫結變數不同,晚期繫結的型別只有在執行階段是已知的。 及早知悉型別可以讓編譯器在執行之前識別問題、準確配置記憶體,以及執行其他最佳化作業。 早期繫結也可以讓 Visual Basic 整合式開發環境 (IDE) 提供物件成員的相關 IntelliSense 說明。 此外,使用早期繫結也能提供較佳的效能。 這是因為儲存在晚期繫結變數中的所有資料必須包裝為型別 Object,而在執行階段存取此型別的成員會使程式變得更慢。

範例

區域變數未使用 As 子句宣告並初始化時,便會發生型別推斷。 編譯器會使用所指派初始值的型別,做為變數的型別。 例如,以下每一行程式碼都會宣告一個 String 型別的變數。

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

下列程式碼示範建立整數陣列的兩個對等方式。

' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}

' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}

使用型別推斷來判斷迴圈控制變數的型別相當方便。 在下列程式碼中,編譯器推斷 number 是 Integer,因為前述範例的 someNumbers2 是整數陣列。

Dim total = 0
For Each number In someNumbers2
    total += number
Next

區域型別推斷可以用在 Using 陳述式中,用來建立資源名稱的型別,如下列範例所示。

Using proc = New System.Diagnostics.Process
    ' Insert code to work with the resource.
End Using

變數的型別也可以根據函式的傳回值來推斷,如下列範例所示。 pList1 和 pList2 都是處理序陣列,因為 Process.GetProcesses 會傳回處理序陣列。

' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

Option Infer

Option Infer 可以讓您指定特定檔案中是否允許區域型別推斷。 若要啟用或封鎖選項,請在檔案開頭輸入下列其中一個陳述式。

Option Infer On

Option Infer Off

如果您沒有在程式碼中指定 Option Infer 的值,則編譯器預設值為 Option Infer On。 若是從 Visual Basic 2008 或舊版升級的專案,編譯器預設值為 Option Infer Off。

注意事項注意事項

如果檔案中設定的 Option Infer 值與 IDE 或命令列中設定的值相衝突,檔案中的值有優先權。

如需詳細資訊,請參閱 Option Infer 陳述式專案設計工具、編譯頁 (Visual Basic)

限制

型別推斷只能用在非靜態區域變數,無法用於判斷類別欄位、屬性或函式的型別。

請參閱

參考

For Each...Next 陳述式 (Visual Basic)

For...Next 陳述式 (Visual Basic)

Option Infer 陳述式

/optioninfer

概念

匿名型別 (Visual Basic)

早期和晚期繫結 (Visual Basic)

Visual Basic 中的 LINQ 簡介