对于泛型类型或者泛型方法,可以对类型指定约束。约束放在类型声明的末尾,然后用where来引入。
1. 引用类型约束: (T : class), 即T必须是一个引用类型。必须放在第一个。
struct Test<T> where T : class
2. 值类型约束: (T : struct) 。 必须放在第一个。
struct Test<T> where T : struct
3. 构造函数类型约束 T : new() , 必须放在最后一个。
传入的实参必须有一个public的无参构造函数。
适用于所有的值类型。所有没有显示声明构造函数的类,或者所有显示声明了一个公开的无参构造函数的类。
public void Test<T1, T2>() where T1 : class, new()
4. 转换类型约束
class Sample<T> where T : Stream
class Sample<T1, T2> where T1: T2 (如Sample<Stream, IDisposable>
class Sample<T> where T : Stream, IEnumerable<string>, IComparable<int> 可以多个接口,但是只能一个class.
指定的类不能是结构,密封类比如string,或者这些特殊类型:
System.Object
System.Enum
System.ValueType
System.Delegate