代码
PublicClassGeneric(OfT)
PublicFieldAsT
EndClass
C#代码
publicclassGeneric
{
publicTField;
}
C++代码
genericpublicrefclassGeneric
{
public:
TField;
};
在创建泛型类的实例时,会指定实际类型来替换类型参数。这会建立一个新的泛型类,称为构造泛型类,选定的类型将替换所有出现的类型参数。最后得到按照您选择的类型定制的类型安全的类,如下面的代码所示。
VisualBasic代码
DimgAsNewGeneric(OfString)
g.Field="Astring"
C#代码
Genericg=newGeneric();
g.Field="Astring";
C++代码
Generic^g=gcnewGeneric();
g->Field="Astring";
解释
下面的术语用于讨论.NETFramework中的泛型:
“泛型类型定义”是用作模板的类、结构或接口声明,其中具有该类、结构或接口声明可以包含或使用的类型的占位符。例如,Dictionary类可以包含两种类型:键和值。因为它只是一个模板,您不能创建作为泛型类型定义的类、结构或接口的实例。
“泛型类型参数”或称“类型参数”是泛型类型或方法定义中的占位符。Dictionary泛型类型具有两个类型参数:TKey和TValue,分别表示其键和值的类型。
所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。n泛型方法方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像 int,double,char 的等)。
“构造泛型类型”或称“构造类型”是为泛型类型定义的泛型类型参数指定类型得到的结果。
“泛型类型参数”是替换泛型类型参数的任何类型。
一般术语“泛型类型”包括构造类型和泛型类型定义。
“约束”是加在泛型类型参数上的限制。例如,可以将类型参数限制为实现IComparer泛型接口的类型以确保可以对该类型的实例进行排序。还可以将类型参数限制为具有特定基类的类型、具有默认构造函数的类型或是引用类型或值类型。泛型类型的用户不能替换不满足这些约束的类型参数。
“泛型方法定义”是具有两个参数列表的方法:一个泛型类型参数列表和一个形参列表。类型参数可以作为返回类型或形参的类型出现,如下面的代码所示。
VisualBasic代码
FunctionGeneric(OfT)(ByValargAsT)AsT
DimtempAsT=arg
...
EndFunction
C#代码
TGeneric(Targ){Ttemp=arg;...}
C++代码
genericTGeneric(Targ){Ttemp=arg;...};
泛型方法可以出现在泛型或非泛型类型上。需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。在下面的代码中,只有方法G是泛型方法。
VisualBasic代码
ClassA
FunctionG(OfT)(ByValargAsT)AsT
...
EndFunction
EndClass
ClassGeneric(OfT)
FunctionM(ByValargAsT)AsT
...
EndFunction
EndClass
C#代码
classA
{
TG(Targ){...}
}
classGeneric
{
TM(Targ){...}
}
C++代码
refclassA
{
genericTG(Targ){...};
};
genericrefclassGeneric
{
TM(Targ){...};
};
VisualC++、C#和VisualBasic都提供了对定义和使用泛型的完全支持。有关更多信息,请参见VisualBasic中的泛型类型、泛型介绍(C#编程指南)和OverviewofGenericsinC++。
嵌套类型和泛型
嵌套于泛型类型中的类型依赖于封闭泛型类型的类型参数,公共语言运行库将这样的嵌套类型视为泛型,即使它们没有自己的泛型类型参数。在创建嵌套类型的实例时,需要为所有封闭泛型类型指定类型参数。



















