主要约束
类型参数可指定零个或一个主要约束
不可指定的引用类型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();
}
}