假如一个泛型没有任何约束,那么它的应用是非常有限的,它不能对实参作任何类型上的保证,这时候就需要使用到泛型的约束:主约束 和 次约束
泛型的主约束和次约束均要求泛型的实参必须满足一定的规范。C#编译器在编译的过程中可以根据约束条件,对所有泛型的类型实参进行检查,以确保满足条件。
一个泛型参数可以至多拥有一个主约束,主约束可以是一个引用类型,类和结构。如果指定一个引用类型,则实参必须是该类型或者该类型的派生类型。
类规定了实参必须是一个引用类型
结构规定了实参必须是一个值类型
一个泛型可以有多个次约束,但同时拥有主约束和次约束的泛型参数,实参必须同时满足主约束和次约束。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//主要约束限定T继承自Exception类型 public class ClassList<T> where T : Exception { private T tException; public ClassList(T t) { this.tException = t; } public override string ToString() { //主要约束保证了tException拥有source成员 return tException.Source; } } //主要约束限定了T是引用类型 public class ClassList2<T> where T : class { private T customT; public void Clear() { customT = null; } } //主要约束限定了T是值类型 public class ClassTValue<T> where T : struct { private T customerT; public override string ToString() { //T是值类型,不会发生NullReferenceException异常 return customerT.ToString(); } }