共用方式為


Generic Procedures in Visual Basic

「泛型程序」(也稱為「泛型方法」) 是使用至少一個型別參數定義的程序。 這可讓呼叫程式碼在每次呼叫程序時,針對其需求量身打造資料類型。

只是在泛型類別或泛型結構內定義程序,並不足以將程序稱為泛型。 若要成為泛型,除了可能接受的任何一般參數之外,程序還必須接受至少一個型別參數。 泛型類別或結構可以包含非泛型程序,而非泛型類別、結構或模組可以包含泛型程序。

泛型程序可以在其一般參數清單、傳回型別 (如果有) 和程序程式碼中使用其型別參數。

類型推斷

您可以呼叫泛型程序,完全不需要提供任何型別引數。 如果您以這種方式呼叫,編譯器會嘗試判斷要傳遞至程序型別引數的適當資料類型。 這稱為「型別推斷」。 下列程式碼顯示一個呼叫,其中編譯器推斷應將 String 類型傳遞至型別參數 t

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

如果編譯器無法從您的呼叫內容推斷型別引數,則會報告錯誤。 這類錯誤的其中一個可能原因是陣列陣序不符。 例如,假設您將一般參數定義為型別參數陣列。 如果您呼叫提供不同陣序 (維度數目) 之陣列的泛型程序,此不相符的情況就會導致型別推斷失敗。 下列程式碼顯示一個呼叫,其中將二維陣列傳遞至預期一維陣列的程序。

Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub

Public Sub callDemoSub()
    Dim twoDimensions(,) As Integer
    demoSub(twoDimensions)
End Sub

您只能透過省略所有型別引數來叫用型別推斷。 如果您提供一個型別引數,就必須提供所有型別引數。

只有泛型程序才支援型別推斷。 您無法在泛型類別、結構、介面或委派上叫用型別推斷。

範例

描述

下列範例定義一個泛型 Function 程序來尋找陣列中的特定元素。 該範例定義一個型別參數,並使用它來建構參數清單中的兩個參數。

程式碼

Public Function findElement(Of T As IComparable) (
        ByVal searchArray As T(), ByVal searchValue As T) As Integer

    If searchArray.GetLength(0) > 0 Then
        For i As Integer = 0 To searchArray.GetUpperBound(0)
            If searchArray(i).CompareTo(searchValue) = 0 Then Return i
        Next i
    End If

    Return -1
End Function

註解

上述範例需要能夠將 searchValuesearchArray 的每個元素進行比較。 為了確保能夠這樣做,它會限制型別參數 T 來實作 IComparable<T> 介面。 此程式碼使用 CompareTo 方法而非 = 運算子,因為提供給 T 的型別引數不保證支援 = 運算子。

您可以使用下列程式碼測試 findElement 程序。

Public Sub tryFindElement()
    Dim stringArray() As String = {"abc", "def", "xyz"}
    Dim stringSearch As String = "abc"
    Dim integerArray() As Integer = {7, 8, 9}
    Dim integerSearch As Integer = 8
    Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
    Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
    MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
    MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
    MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

上述對 MsgBox 的呼叫會分別顯示 "0"、"1" 和 "-1"。

另請參閱