类型列表 (Visual Basic)

指定泛型程序元素的类型参数。 多个参数以逗号分隔。 以下是某一类型参数的语法。

语法

[genericmodifier] typename [ As constraintlist ]

组成部分

术语 定义
genericmodifier 可选。 只能在泛型接口和委托中使用。 可以使用 Out 关键字声明类型协变,或者使用 In 关键字声明逆变。 请参阅 协变和逆变
typename 必需。 类型参数的名称。 这是将由相应的类型实参所提供的已定义类型替换的占位符。
constraintlist 可选。 要求列表,约束为 typename 提供的数据类型。 如果有多个约束,请将它们括在大括号 ({ }) 中并使用逗号分隔它们。 必须使用 As 关键字引入约束列表。 在列表的开头只能使用 As 一次。

注解

每个泛型编程元素必须至少使用一个类型参数。 类型参数是在其创建泛型类型的一个实例时,客户端代码指定的特定类型(构造的元素)的占位符。 可以定义泛型类、结构、接口、过程或委托。

有关何时定义泛型类型的详细信息,请参阅 Visual Basic 中的泛型类型。 有关类型参数名称的详细信息,请参阅声明的元素名称

规则

  • 括号。 如果提供类型参数列表,则必须将其括在括号中,并且必须使用 Of 关键字引入列表。 在列表的开头只能使用 Of 一次。

  • 约束。 类型参数的约束列表可以任何组合形式包括以下项:

    • 任意数量的接口。 提供的类型必须实现此列表中的每个接口。

    • 最多一个类。 提供的类型必须继承自该类。

    • New 关键字。 提供的类型必须公开泛型类型可以访问的无参数构造函数。 如果通过一个或多个接口约束类型参数,这很有用。 实现接口的类型不一定公开构造函数,根据构造函数的访问级别,泛型类型中的代码可能无法访问它。

    • Class 关键字或 Structure 关键字。 Class 关键字约束泛型类型参数,以要求传递给它的任何类型参数是引用类型(例如字符串、数组或委托),或者从类创建的对象。 Structure 关键字约束泛型类型参数,以要求传递给它的任何类型参数是值类型(例如结构、枚举或基本数据类型)。 不能在同一个 constraintlist 中同时包括 ClassStructure

    提供的类型必须满足包括在 constraintlist 中的每个要求。

    每个类型参数的约束独立于其他类型参数的约束。

行为

  • 编译时替换。 从泛型编程元素创建构造的类型时,为每个类型参数提供定义的类型。 Visual Basic 编译器将提供的类型替换为泛型元素中 typename 的每个匹配项。

  • 缺少约束。 如果未指定类型参数的任何约束,则代码仅限于该类型参数的对象数据类型支持的操作和成员。

示例 1

以下示例演示了泛型字典类的主干定义,包括用于将新条目添加到字典中的主干函数。

Public Class dictionary(Of entryType, keyType As {IComparable, IFormattable, New})
    Public Sub add(ByVal et As entryType, ByVal kt As keyType)
        Dim dk As keyType
        If kt.CompareTo(dk) = 0 Then
        End If
    End Sub
End Class

示例 2

由于 dictionary 是泛型,因此使用它的代码可以从中创建各种对象,每个对象具有相同的功能,但作用于不同的数据类型。 以下示例演示一行代码,该代码行创建包含 String 条目和 Integer 键的 dictionary 对象。

Dim dictInt As New dictionary(Of String, Integer)

示例 3

以下示例演示了前面示例生成的等效主干定义。

Public Class dictionary
    Public Sub Add(ByVal et As String, ByVal kt As Integer)
        Dim dk As Integer
        If kt.CompareTo(dk) = 0 Then
        End If
    End Sub
End Class

另请参阅