18.10 数组协变
还记得委托中的协变吗?委托方法的返回值类型直接或间接地继承自委托签名的返回值类型,称为协变。同理,数组的协变也是因为涉及了类型之间的派生关系。数组协变的含义是,允许将数组类型的派生类型赋给数组元素。在代码清单18-15中,我们定义了两个类:Person和Student,Student是Person的派生类,我们继续定义一个Person类型的数组,很显然,数组的数据元素也应该是Person类型,但借助数组协变的特性,将Student类型的类实例赋给了数据元素,这是允许的。
代码清单18-15 数组协变示例
class Person//基类
{
public int Age{get;set;}
public override string ToString()
{
return string.Format(“年龄:{0}”,Age);
}
}
class Student:Person//Student类继承自Person类
{
}
class ArraySample
{
public static void Main()
{
Person[]array1=new Person[3];//Person类型的数组
for(int i=0;i<array1.Length;i++)
{
//将Person类的派生类Student类型的实例赋给数组元素
array1[i]=new Student{Age=10*(i+1)};
}
foreach(Person person in array1)//打印数组元素的数据内容
{
System.Console.WriteLine(person);
}
}
}
并不是所有类型的数组都可以使用协变的特性,只有满足以下条件才可以:
❑数组的类型必须是引用类型。原因很简单,所有的值类型都是密封的,因此不能派生出新的值类型,那么当使用值类型声明了一个数组以后,就不存在数组类型的派生类型来赋值到数组元素,很显然,值类型不符合数组协变的适用场景。
❑赋值的类型派生自数组的类型,它们之间可以隐式或显式地转换。
数组协变如图18-20所示。
图 18-20 数组协变