泛 型程式也稱為 泛型方法,是使用至少一個類型參數定義的程式。 這可讓呼叫程式代碼在每次呼叫程式時,根據其需求量身打造數據類型。
程式不是泛型,只要在泛型類別或泛型結構內定義即可。 若要為泛型,除了可能需要的任何一般參數之外,程式還必須至少採用一個類型參數。 泛型類別或結構可以包含非泛型程式,而非泛型類別、結構或模組可以包含泛型程式。
泛型程式可以在其一般參數清單中、其傳回型別中,以及其程式代碼中使用其類型參數。
類型推斷
您可以呼叫泛型程式,而不需提供任何類型自變數。 如果您以這種方式呼叫,編譯程式會嘗試判斷適當的數據類型,以傳遞至程式的型別自變數。 這稱為 類型推斷。 下列程式碼顯示了一次呼叫,其中編譯器推斷應將型別 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
評論
上述範例需要能夠將searchValue與searchArray的每個項目進行比較。 為了保證這項功能,它會限制類型參數 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」。