Animal[] animalArray = new Bird[3]; animalArray[0] = new Bird(); Console.WriteLine(animalArray[0].GetType().Name); //Bird
//System.ArrayTypeMismatchException:“Attempted to access an element as a type incompatible with the array.” animalArray[1] = new Animal(); } } classAnimal { } classBird : Animal { } }
如果泛型接口或委托的泛型参数被声明为协变或逆变,该泛型接口或委托则被称为“变体”。
错误示范:
1 2 3 4 5
List<Object> list = new List<string>(); //实现变体接口的类仍是固定类,这样是无法转换的。
IEnumerable<int> integers = new List<int>(); IEnumerable<Object> objects = integers; //只能用于引用类型
创建变体泛型接口
通过对泛型类型参数使用out关键字,将参数声明为协变。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
interface ICovariant<out R> { R GetSomething(); voidDoSomething(Action<R> callback); //逆变参数 }