在 C# 泛型中,主要约束和次要约束用于限制泛型类型参数的使用,确保类型参数满足一定的条件,从而提高代码的可靠性和可维护性。以下是主要约束和次要约束的详细介绍:
主要约束
- 引用类型约束(class):表示泛型类型参数必须是引用类型,包括类、接口、委托和数组类型等。例如,定义一个只能接受引用类型的泛型方法:
void ProcessReferenceType<T>(T obj) where T : class
{
// 这里可以安全地假设T是一个引用类型
}
- 值类型约束(struct):要求泛型类型参数必须是值类型,如枚举、结构体等。示例如下:
void ProcessValueType<T>(T value) where T : struct
{
// 这里可以安全地假设T是一个值类型
}
- 无参数构造函数约束(new ()):规定泛型类型参数必须具有无参数的公共构造函数,这样在泛型代码中可以使用
new
关键字来创建类型参数的实例。例如:
T CreateInstance<T>() where T : new()
{
return new T();
}
- 基类约束:指定泛型类型参数必须是指定基类或其子类。比如,有一个基类
BaseClass
,可以这样约束泛型类型参数:
void ProcessBaseClass<T>(T obj) where T : BaseClass
{
// 这里可以安全地假设T是BaseClass或其子类
}
- 接口约束:表示泛型类型参数必须实现指定的接口。例如,定义一个泛型方法,要求类型参数实现
IComparable
接口:
void CompareObjects<T>(T obj1, T obj2) where T : IComparable<T>
{
// 这里可以安全地假设T实现了IComparable<T>接口
}
次要约束
- 泛型类型参数约束:一个泛型类型参数可以基于另一个泛型类型参数进行约束。例如,定义两个泛型类型参数
T
和U
,要求U
是T
的子类或实现了T
接口:
void ProcessGenericTypes<T, U>(T obj1, U obj2) where U : T
{
// 这里可以安全地假设U是T的子类或实现了T接口
}
- 裸类型约束:在泛型类型参数列表中,可以使用裸类型作为约束。裸类型约束允许你指定泛型类型参数必须是某个具体类型或其子类型。例如:
class MyGenericClass<T> where T : MyBaseClass
{
// 这里的T必须是MyBaseClass或其子类
}