一、默认值
不能把null值赋予泛型类型,原因是泛型类型也可以实例化为值类型,而null值只能用于引用类型。
可以使用default关键字解决此问题,通过default关键字,将null赋予引用类型,将0赋予值类型。
public TDocument GetDocument()
{
TDocument doc = default(TDocument);
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
二、约束
泛型支持几种约束类型,如下所示:
(1)class DocumentManager<TDocument> where TDocument :IDocument 接口约束,类型TDocument必须实现IDocument接口
(2)class DocumentManager<TDocument> where TDocument :struct 结构约束,类型TDocument必须是值类型
(3)class DocumentManager<TDocument> where TDocument :class 结构约束,类型TDocument必须是引用类型
(4)class DocumentManager<TDocument> where TDocument :new() 构造函数约束,类型TDocument必须有一个默认构造函数
(4)class DocumentManager<TDocument> where TDocument :T2 类型TDocument派生自泛型类型T2
说明:只能为默认构造函数定义构造函数约束,不能为其它构造函数定义构造函数约束。
泛型类型可以合并多个约束,如下所示,指定类型TDocument必须实现IDocument接口,并且必须有一个默认构造函数
class DocumentManager<TDocument> where TDocument :IDocument,new()
在C#中,where子句的一个重要限制是,不能定义必须由泛型类型实现的运算符,运算符不能在接口中定义,在where子句中,只能定义基类,接口和默认构造函数。
三、继承
泛型类型可以实现泛型接口,也可以派生自一个类,泛型类型可以派生自泛型基类:
public class Base<T>{}
public class Derived<T>:Base<T>{}
其要求是必须重复接口的泛型类型,或者必须指定基类的类型,如下例所示:
public class Base<T>{}
public class Derived<T>:Base<string>{}
于是,派生类可以是泛型类或非泛型类