1.泛型类
类型参数跟在类名后面。
class 类名<类型参数>
{
//类体
}
2.泛型接口
类型参数跟在接口名后面。
interface I接口名<类型参数>
{
//接口体
}
3.泛型方法
类型参数跟在方法名后面。
返回类型 方法名<类型参数>(类型 形参)
{
//方法体
}
方法调用时,可以根据实参推断出类型参数的类型,无需显式指定。
方法名<类型参数>(实参)
方法名(实参)
4.构造(Constructed)类型
封闭式构造(closed constructed)类型:指定类型参数,例如,Node<int>
。
开放式构造(open constructed)类型:未指定类型参数,例如,Node<T>
。
泛型类可继承自封闭式构造或开放式构造基类。
非泛型类(即,具体类)可继承自封闭式构造基类,但不可继承自开放式构造类,因为运行时客户端代码无法提供实例化基类所需的类型参数。
5.类型参数的约束
通过使用 where
上下文关键字指定约束。
约束 | 描述 |
---|---|
where T : struct | 类型参数必须是 非Nullable 的值类型。struct 约束不能与 new() 约束结合使用,也不能与 unmanaged 约束结合使用。 |
where T : class | 类型参数必须是 非Nullable 的引用类型。此约束还应用于任何类、接口、委托或数组类型。 |
where T : class? | 类型参数必须是 Nullable 或 非Nullable 的引用类型。此约束还应用于任何类、接口、委托或数组类型。 |
where T : notnull | 类型参数必须是 非Nullable 的类型。 |
where T : default | 重写方法或提供显式接口实现时,如果需要指定不受约束的类型参数,此约束可解决歧义。 default 约束表示基方法,但不包含 class 或 struct 约束。 |
where T : unmanaged | 类型参数必须是 非Nullable 的非托管类型。unmanaged 约束表示 struct 约束,且不能与 struct 约束或 new() 约束结合使用。 |
where T : new() | 类型参数必须具有public 无参数构造函数。 与其它约束一起使用时,new() 约束必须最后指定。 new() 约束不能与 struct 和 unmanaged 约束结合使用。 |
where T : 基类名 | 类型参数必须是指定的基类或派生自指定的基类。T 必须是从指定基类派生的 非Nullable 的引用类型。 |
where T : 基类名? | 类型参数必须是指定的基类或派生自指定的基类。T 可以是从指定基类派生的 Nullable 或 非Nullable 的类型。 |
where T : 接口名 | 类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。T 必须是实现指定接口的 非Nullable 的类型。 |
where T : 接口名? | 类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。T 可以是 Nullable 的引用类型、非Nullable 的引用类型、值类型。 T 不能是Nullable 的值类型。 |
where T : U | 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。如果 U 是 非Nullable 的引用类型,T 必须是 非Nullable 的引用类型。如果 U 是 Nullable 的引用类型,则 T 可以是 Nullable 的引用类型,也可以是 非Nullable 的引用类型。 |
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/13549.html