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”。

另请参阅