C#泛型约束

本文将对各类泛型约束做一个简单的总结。

文章一开始,给出演示代码底稿(在此基础上修改,演示,说明。)

class MyList<T> 
{
    List<T> list = new List<T>();
    public T this[int i]
    {
        get { return list[i]; }
        set { this.list[i] = value; }
    }
}

class Person
{
    public string Name { get; set; }
}

接下来,依次修改演示代码底稿,来说明不同类型的泛型约束。

 

1 指定泛型参数为值类型

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

看看加上约束后的效果怎么样,按下面方式实例化MyList

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

你会发现,将产生如下错误提示:

类型“GencConstraint.Person”必须是不可为 null 的值类型才能用作泛型类型或方法“GencConstraint.MyList<T>”中的参数“T”。

使用下面的方式实例化MyList,将一切正常:

 MyList<int> list = new MyList<int>();


 

指定泛型参数为引用类型

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

修改泛型约束为引用类型后,前面的错误提示消失,因为Person类是引用类型,满足泛型约束。

 

指定泛型参数有无参的公共的构造函数

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

为Person类增加私有的无参构造函数,代码如下:

class Person
{
    public string Name { get; set; }
    private Person()
    { 
        //do nothing
    }
}

实例化MyList<Person>类:

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

出现编译错误,提示:

“GencConstraint.Person”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“GencConstraint.MyList<T>”中的参数“T”。

哈哈,约束起作用了。

 

指定泛型参数必须派生于指定基类

增加抽象类SeniorAnimal

abstract class SeniorAnimal//高级动物
{
    public abstract void Speak();//会说话
    public abstract void UseTool();//会使用工具
}

指定泛型参数必须派生于基类SeniorAnimal

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

实例化MyList<Person>类(此时Person类还未继承自SeniorAnimal):

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

出现编译错误,提示:

不能将类型“GencConstraint.Person”用作泛型类型或方法“GencConstraint.MyList<T>”中的类型参数“T”。没有从“'GencConstraint.Person”到“GencConstraint.SeniorAnimal”的隐式引用转换。

修改代码,使Person类继承自SeniorAnimal

class Person : SeniorAnimal
{
    public string Name { get; set; }

    public override void Speak()
    {
        Console.WriteLine("我会说脏话!");
    }

    public override void UseTool()
    {
        Console.WriteLine("我会用砍刀!");
    }
}

再次编译,一切正常。

 

5 指定泛型参数必须实现指定接口

演示情况和第4点类似,就不提供演示代码了。

 

指定泛型参数必须派生于泛型类型U(裸类型约束)

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

 

 

另外,可以为同一泛型参数应用多个约束。

 

好了,Game Over!

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值