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

只能通过省略所有类型参数来调用类型推理。 如果提供一个类型参数,则必须全部提供它们。

仅泛型过程支持类型推理。 不能对泛型类、结构、接口或委托调用类型推理。

示例:

DESCRIPTION

以下示例定义一个泛型 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”。

另请参阅