泛型类型约束
一.new 约束
new 约束指定泛型类声明中的类型实参必须有公共的无参数构造函数。 若要使用 new 约束,则该类型不能为 抽象类型。 当泛型类创建类型的新实例时,请将 new 约束应用于类型参数,如下面的示例所示:
class ItemFactory<T> where T : new() { public T GetNewItem() { return new T(); } }
当与其他约束一起使用时, new() 约束必须最后指定:
public class ItemFactory2<T> where T : IComparable, new() { }
二.where(泛型类型约束)
泛型定义中的 where 子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束。 约束可 指定接口、基类或要求泛型类型为引用、值或非托管类型。 它们声明类型参数必须具备的功能。 例如,可以声明一个泛型类 AGenericClass ,以使类型参数 T 实现 IComparable 接口:
public class AGenericClass<T> where T : IComparable<T> { }
where 子句还可包括基类约束。 基类约束表明用作该泛型类型的类型参数的类型具有指定的类作为基类(或者 是该基类)。 该基类约束一经使用,就必须出现在该类型参数的所有其他约束之前。 某些类型不允许作为基类约 束:Object、Array 和 ValueType。 在 C# 7.3 之前,Enum、Delegate 和 MulticastDelegate 也不允许作为基类约束。 以下示例显示现可指定为基类的类型:
public class UsingEnum<T> where T : System.Enum { } public class UsingDelegate<T> where T : System.Delegate { } public class Multicaster<T> where T : System.MulticastDelegate { }