类型列表

更新:2007 年 11 月

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

typename [ As constraintlist ]

各部分说明

  • typename
    必选。类型参数的名称。这是一个占位符,将替换为相应的类型参数所提供的已定义类型。

  • constraintlist
    可选。要求列表,用于约束可提供给 typename 的数据类型。如果拥有多个约束,请将它们置于大括号 ({ }) 内并用逗号分隔各约束。您必须使用 As 关键字引入约束列表。As 关键字只能在列表的起始处使用一次。

备注

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

有关何时定义泛型类型的更多信息,请参见 Visual Basic 中的泛型类型。有关类型参数名称的更多信息,请参见已声明元素的名称

规则

  • **括号。**如果您提供了一份类型参数列表,必须将其置于括号内,并且必须使用 Of 关键字引入此列表。Of 关键字只能在列表的起始处使用一次。

  • **约束。**类型参数中的约束列表可以包括以下项目的任意组合:

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

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

    • New (Visual Basic) 关键字。提供的类型必须公开泛型类型可以访问的无参数构造函数。这一点在使用一个或多个接口约束类型参数时非常有用。实现接口的类型不必公开构造函数,并且受构造函数的访问级别限制,泛型类型中的代码可能无法访问该构造函数。

    • Class (Visual Basic) 关键字或 Structure (Visual Basic) 关键字。如果约束中包括 Class,则提供的类型必须为引用类型。如果约束中包括 Structure,则提供的类型必须为值类型。不能在同一个 constraintlist 中同时包括 Class 和 Structure。

    提供的类型必须符合 constraintlist 中的每一个要求。

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

行为

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

  • **缺少约束。**如果类型参数中未指定任何约束,代码将只限于受该类型参数的 Object 数据类型支持的操作和成员。

示例

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

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

由于 dictionary 为泛型,因此使用它的代码可以根据它创建多种对象,创建的每种对象都具有相同的功能,但却作用于不同的数据类型。下面的示例显示一行代码,该代码将创建一个 dictionary 对象,该对象具有 String 项和 Integer 键。

Dim dictInt As New dictionary(Of String, Integer)

下面的示例显示由上述示例生成的等效主干定义。

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

请参见

任务

如何:使用泛型类

概念

Visual Basic 中的访问级别

参考

Of

New (Visual Basic)

Class (Visual Basic)

Structure (Visual Basic)

Object 数据类型

Function 语句 (Visual Basic)

Structure 语句

Sub 语句 (Visual Basic)