目录
1 值类型约束(where T : struct)
2 引用类型约束(where T : class)
3 无参构造函数约束(where T : new ())
4 基类约束(where T : <基类名>)
5 接口约束(where T : <接口名>)
6 类型参数约束(where T : U)
7 多个约束组合
1 值类型约束(where T : struct)
要求类型参数T
必须是值类型,不能是引用类型。所有的内置数值类型(如int
、double
等)、enum
类型以及自定义的结构体等都满足这种约束。
2 引用类型约束(where T : class)
规定类型参数T
必须是引用类型,包括类、接口、委托、数组(数组在 C# 里是引用类型,不管里面装的值类型还是引用类型的数据。这可能和其他一些语言不同,比如 C++ 中的数组是值类型。C# 将数组设计为引用类型,是为了统一内存管理、支持继承多态以及保持与其他引用类型的一致性。这一设计简化了开发者对数组的使用,并充分利用了 CLR(公共语言运行时)的特性。)等。
3 无参构造函数约束(where T : new ())
要求类型参数T
必须具有一个无参数的公共构造函数,这样在泛型代码中才可以使用new
关键字创建T
的实例。
4 基类约束(where T : <基类名>)
表明类型参数T
必须是指定基类或从该基类派生的类。
5 接口约束(where T : <接口名>)
意味着类型参数T
必须实现指定的接口,保证在泛型代码中可以调用接口中定义的成员。
6 类型参数约束(where T : U)
表示类型参数T
必须是另一个类型参数U
或从U
派生的类型,用于建立类型参数之间的继承关系约束。
7 多个约束组合
可以同时使用多个约束来更精确地限制类型参数。
class MyContainer<T> where T : class, IComparable<T>, new()
{// T必须是引用类型,实现了IComparable<T>接口,并且有一个无参构造函数
}