C# 泛型约束

来源:互联网 发布:百度数据库工程师 编辑:程序博客网 时间:2024/05/16 09:59

主要约束

类型参数可指定零个一个主要约束

不可指定的引用类型System.Object System.Array

System.Delegate System.MulticastDelegate

System.ValueType System.Enum System.Void

class Sample<T> where T: Stream{}
有两个特殊的主要约束class struct

class Sample<T> where T : class{    public void M()    {        T tmp = null;    }}
tmp被设为null是合法的,因为它是引用类型。若上述代码不对T作class的约束,则将不能通过编译
class Sample<T> where T : struct{    public static T Factory()    {        return new T();    }}
上述new T()也被为全法,T为值类型,而所有值类型都引式地有一个公共无参构造器

若改stuct为class将不能通过编译,不是所有的引用类型都有元参构造器

次要约束

类型参数可指定零个多个次要约束

private static List<Tbase> ConvertIList<T, Tbase>(IList<T> list)    where T:Tbase{    List<Tbase> baseList = new List<Tbase>(list.Count);    foreach(Tbase atom in list)    {        baseList.Add(atom);    }    return baseList;}
以上,指定了两个类型参数,其中T是由Tbase类型参数约束

多个约束的情形

class Sample<T1, T2>     where T1 : class, T2    where T2 : IList<Int32>{}

构造器约束

类型参数可指定零个一个构造器参数

class ConstructorConstraint<T>    where T: new (){    public static T Factory()    {        return new T();    }}
还记不记上面说过的”若改stuct为class将不能通过编译,不是所有的引用类型都有元参构造器“

加了无参构造器约束后,就可以用new()通过编译了

更清楚一点的情况

class ConstructorConstraint<T>    where T: class, new (){    public static T Factory()    {        return new T();    }}

0 0
原创粉丝点击