C# 泛型约束

主要约束

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

不可指定的引用类型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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值