类型约束
基类约束有两个重要的目的。
1:它允许在泛型类中使用有约束指定的基类成员。
2:确保只能使用支持指定基类或派生类的类型实例。
约束是使用 where 上下文关键字指定的。
下表列出了五种类型的约束:
约束 | 说明 |
T:struct | 类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。 |
T:class | 类型参数必须是引用类型,包括任何类、接口、委托或数组类型。 |
T:new() | 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U | 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束. |
1:派生约束:
将约束定义在父类中,由其派生出的子类将受其约束。
(1):被约束类进行约束,列表list可以使用约束类中的成员。类型为 T 的所有项都保证是 基类对象或从 基类继承的对象
(2):实例化list的时候,尖括号<>中类型只能是基类或是其派生类的数据类型来实例化。
实例:
class Program{static void Main(string[] args){// 只能使用animal 或者dog (基类或者其派生类) 这就是约束animalFamily<dog> cate = new animalFamily<dog>();cate.Add(new dog("aaa"));cate.Add(new dog("bbb"));cate.Add(new dog("ccc"));cate.Display();Console.ReadLine();}}/// <summary>/// 动物基类/// </summary>class animal{public string name;public animal(string nameValue){name = nameValue;}}/// <summary>/// 狗类继承自动物类/// </summary>class dog : animal{public dog(string nameValue) :base(nameValue){}}/// <summary>/// 动物家庭类,继承自动物类/// </summary>/// <typeparam name="T"></typeparam>class animalFamily<T> where T : animal{public List<T> family = new List<T>();public void Add(T member){family.Add(member);}public void Display(){foreach (T item in family){Console.WriteLine(item.name);}}}
2:约束多个参数
可以对多个参数应用约束,并对一个参数应用多个约束,如下面的示例所示:
class Base { }
class Test<T, U>where U : structwhere T : Base, new() { }
关于约束,先简单看到这里,以后再补充。
有好的建议,请在下方输入你的评论。