public void GenericityContravariant() { // 直接声明Animal类 Animal animal = new Animal(); Console.WriteLine($"{animal.GetType()}"); // 直接声明Cat类 Cat cat = new Cat(); Console.WriteLine($"{cat.GetType()}"); // 声明子类对象指向父类 Animal animal2 = new Cat(); Console.WriteLine($"{animal2.GetType()}"); // 声明Animal类的集合 List <Animal> listAnimal = new List <Animal>(); foreach (var item in listAnimal) { Console.WriteLine($"{item.GetType()}"); } // 声明Cat类的集合 List <Cat> listCat = new List <Cat>(); foreach (var item in listCat) { Console.WriteLine($"{item.GetType()}"); } ICustomerListIn <Cat> customerListCat1 = new CustomerListIn <Cat>(); Console.WriteLine($"{customerListCat1.GetType()}"); ICustomerListIn <Cat> customerListCat2 = new CustomerListIn <Animal>(); Console.WriteLine($"{customerListCat2.GetType()}"); Assert.IsTrue(true); }
public void Tshow() { //协变:接口泛型参数加了个out,就是为了解决上述的问题 { ICustomerListOut <Bird> customerList2 = new CustomerListOut <Sparrow>(); customerList2.Get();/*有返回值*/ } //逆变 { ICustomerListIn <Sparrow> customerList1 = new CustomerListIn <Bird>(); customerList1.Show(new Sparrow() { Id = 1, Name = "张三" }); /*有参数*/ } { IMyList <Sparrow, Bird> myList2 = new MyList <Sparrow, Sparrow>(); //协变 IMyList <Sparrow, Bird> myList3 = new MyList <Bird, Bird>(); //逆变 IMyList <Sparrow, Bird> myList4 = new MyList <Bird, Sparrow>(); //协变+逆变 } }
public static void Show() { { Bird parent1 = new Bird(); Bird parent2 = new Sparrow(); Sparrow child = new Sparrow(); } { List <Bird> birdList = new List <Bird>(); //List<Bird> birdList1 = new List<Sparrow>();//两个list泛型实例不存在继承关系, //每只麻雀都是一只鸟,但是list不知道,需要强制去转 List <Bird> birdList2 = new List <Sparrow>().Select(c => (Bird)c).ToList();//把每一只麻雀转换为bird } { IEnumerable <Bird> birdList1 = new List <Bird>(); IEnumerable <Bird> birdList2 = new List <Bird>(); } { ICustomerListOut <Bird> customerList = new CustomerListOut <Bird>(); ICustomerListOut <Bird> customerList1 = new CustomerListIn <Sparrow>(); } }