泛型类的功能

一、默认值

不能把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>{}

于是,派生类可以是泛型类或非泛型类

你可能感兴趣的:(泛型类)