类型参数的约束
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:
T:结构 |
类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型. |
T:类 |
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。 |
T:new() |
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> |
类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> |
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U |
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。 |
下面来用实例说明一下:
<基类名>;new();
先来定义一个类
public class Article
{
private string m_title;
private DateTime m_createdate;
public Article()
{
}
public Article(string title)
{
this.m_title = title;
}
public string Title
{
get
{
return this.m_title;
}
set
{
this.m_title = value;
}
}
public DateTime CreateDate
{
get
{
return this.m_createdate;
}
set
{
this.m_createdate = value;
}
}
}
接下来就是泛型约束的实现
//指定类型参数的类型约束,这里的参数只能是Article类,并且这个类要提供一个无参数的构造函数。
public class GenericWhere<T> where T :Article, new()
{
private T m_genwhere;
//声明一个类型参数的属性
public T GenWhere
{
get
{
return this.m_genwhere;
}
set
{
this.m_genwhere = value;
}
}
public GenericWhere(T genW)
{
this.m_genwhere = genW;
}
}
public class GenericWhereApply
{
public void GencWhereMethod()
{
Article art = new Article();
GenericWhere<Article> gw = new GenericWhere<Article>(art);
//这样就可以通赤gw的GenWhere属性访问Article的所有成员。
string str = gw.GenWhere.Title;
}
}
public class GenericWhere<T> where T :Article, new()
{
private T m_genwhere;
//声明一个类型参数的属性
public T GenWhere
{
get
{
return this.m_genwhere;
}
set
{
this.m_genwhere = value;
}
}
public GenericWhere(T genW)
{
this.m_genwhere = genW;
}
}
public class GenericWhereApply
{
public void GencWhereMethod()
{
Article art = new Article();
GenericWhere<Article> gw = new GenericWhere<Article>(art);
//这样就可以通赤gw的GenWhere属性访问Article的所有成员。
string str = gw.GenWhere.Title;
}
}
其它几种类型的约束大概的用法都差不多,它们的类型参数都需要是受约束的类型。