共用方式為


區域型別推斷

更新: 2008 年 7 月

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

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub
注意事項:

區域型別推斷不能用來宣告類別 (Class) 欄位。如果上一個範例中的 num2 是欄位而非區域變數,則宣告會造成 Option Strict 為 On 的錯誤,並且會將 num2 分類為 Option Strict 為 Off 的 Object。相同地,當 Option Strict 為 On 時也無法推斷靜態變數的型別。Option Strict 為 Off 時,Static staticVar = 5 中 staticVar 的型別為 Object。

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

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

注意事項:

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

範例

區域變數未使用 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 都是處理程序的清單。

' 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 的值,則針對在 Visual Basic 2008 中建立的專案,編譯器預設是 Option Infer On,至於從舊版升級的專案則為 Option Infer Off。如需詳細資訊,請參閱Option Infer 陳述式/optioninfer

注意事項:

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

限制

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

請參閱

概念

匿名型別

早期和晚期繫結

Visual Basic 中的 LINQ 簡介

參考

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

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

Option Infer 陳述式

/optioninfer

變更記錄

日期

記錄

原因

2008 年 7 月

將「範例」一節中文字內的迴圈控制變數名稱,由 num 變更為 number,以符合程式碼中的名稱。

客戶回函。