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

注释

在上例中,需要能够将 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”。

请参见

任务

如何:定义可对不同数据类型提供相同功能的类 (Visual Basic)

如何:使用泛型类 (Visual Basic)

参考

类型列表 (Visual Basic)

参数列表 (Visual Basic)

概念

Visual Basic 中的泛型类型 (Visual Basic)

Visual Basic 中的过程

过程参数和变量 (Visual Basic)