您的位置:首页 > 编程学习 > ASP.NET

ASP.NET泛型约束

更多 2016/11/18 来源:ASP.NET学习浏览量:1154
学习标签: 泛型约束
本文导读:在ASP.NET编程中,经常会用到泛型,在定义泛型时,可以在对象实例化时用于对类型种类施加限制。如果尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误,这些限制称为约束。在ASP.NET中,约束是使用where 上下文关键字指定的。

一、指定泛型参数为值类型,即 T:结构

 

1、类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。

2、例如:

 

class MyList<T> where T:struct  
{  
...代码省略部分  
}  

3、 实例化类时: MyList<int> list = new MyList<int>(); 

 

二、指定泛型参数为引用类型,即 T:类

 

1、类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

2、例如:

 

class MyList<T> where T:class   
{  
...代码省略部分   
}   

3、 实例化类时: MyList<Birds> list = new MyList<Birds>(); 

 

三、指定泛型参数有无参的公共的构造函数,即 T:new()

 

1、类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

2、例如:

 

class MyList<T> where T:new()  
{  
...代码省略部分  
}  

3、实例化时:

(1)、为Person类增加私有的无参构造函数:

 

class Person  
{  
    public string Name { get; set; }  
    public Person() //必须包含 
{ //do nothing } }

(2)、MyList<Person> list = new MyList<Person>();

 

四、 指定泛型参数必须派生于指定基类,即 T:<基类名>

 

1、类型参数必须是指定的基类或派生自指定的基类。

2、实例:

(1)、增加抽象类Animal

 

abstract class Animal
{  
    public abstract void A();  
    public abstract void B();  
}  

(2)、使Birds类继承自Animal类

 

class Bird : Animal  
{  
    public string Name { get; set; }  
  
    public override void A()  
    {  
        
    }  
  
    public override void B()  
    {  
        
    }  
}  

(3)、指定泛型参数必须派生于基类Animal

 

3、实例化时:MyList<Person> list = new MyList<Person>(); 

 

五、指定泛型参数必须实现指定接口,即 T:<接口名称>

 

1、类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

2、和第四点类似。

 

六、指定泛型参数必须派生于泛型类型U,即 T:U

 

1、为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

2、例如:

 
class MyList<U> where U : SeniorAnimal  
{  
    List<U> list = new List<U>();  
    public void ShowInfo<T>() where T : U  
    {  
    }  
}  

 

收藏
34
很赞
273
您可能感兴趣