当⼀个泛型参数没有任何约束时,它可以进⾏的操作和运算是⾮常有限的,因为不能对实参进⾏任何类型
上的保证,这时候就需要⽤到泛型约束。泛型的约束分为:主要约束和次要约束,它们都使实参必须满⾜
⼀定的规范,C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满⾜约束条件。
(1)主要约束
16
⼀个泛型参数⾄多拥有⼀个主要约束,主要约束可以是⼀个引⽤类型、class或者struct。如果指定⼀个引
⽤类型(class),那么实参必须是该类型或者该类型的派⽣类型。相反,struct则规定了实参必须是⼀个
值类型。下⾯的代码展示了泛型参数主要约束:
1
public class ClassT1<T> where T : Exception
2
{
3
private T myException;
4
public ClassT1(T t)
5
{
6
myException = t;
7
}
8
public override string ToString()
9
{
10
//
主要约束保证了
myException
拥有
source
成员
11
return myException.Source;
12
}
13
}
14
15
public class ClassT2<T> where T : class
16
{
17
private T myT;
18
public void Clear()
19
{
20
// T
是引⽤类型,可以置
null
21
myT = null;
22
}
23
}
24
25
public class ClassT3<T> where T : struct
26
{
27
private T myT;
28
public override string ToString()
29
{
30
// T
是值类型,不会发⽣
NullReferenceException
异常
31
return myT.ToString();
32
}
17
(2)次要约束
次要约束主要是指实参实现的接⼝的限定。对于⼀个泛型,可以有0到⽆限的次要约束,次要约束规定了实
参必须实现所有的次要约束中规定的接⼝。次要约束与主要约束的语法基本⼀致,区别仅在于提供的不是
⼀个引⽤类型⽽是⼀个或多个接⼝。例如我们为上⾯代码中的ClassT3增加⼀个次要约束:
1
public class ClassT3<T> where T : struct, IComparable
2
{
3
......
4
}