C# 关于泛型之协变逆变
协变+逆变是一种高级约束====为了规避异常情况
为什么要有协变和逆变
class Program
{
static void Main(string[] args)
{
#region 协变与逆变,泛型的缺陷
{
Bird bird1 = new Bird();
Bird bird2 = new Sparrow();
Sparrow sparrow1 = new Sparrow();
//Sparrow sparrow2 = new Bird();
List birdlist1 = new List();//一堆鸟就是一堆鸟
List birdlist2 = new List(); //报错:一堆麻雀是一堆鸟不成立(1.泛型的缺陷)
//为什么报错:
//1.List 是个类
//2.List 也是一个类
//3.这两者没有父子关系---从C#语法上来讲,不能这样写
List birdlist3 = new List().Select(c => (Bird)c).ToList();
}
//接口间的协变与逆变,委托之间的协变与逆变,out in 关键字
//协变---可以让左边使用父类,类型参数使用 out来修饰----类型参数只能做返回值,不能做参数
{
IEnumerable birdlist1 = new List();
IEnumerable birdlist2 = new List();
//List 继承自 IEnumerable,List与IEnumerable是父子类关系
Func func = new Func(() => { return null; });
ICustomerListOut customerList1 = new CustomerListOut();
ICustomerListOut customerList2 = new CustomerListOut();
}
//逆变--in--可以让左边使用子类:类型参数使用in修饰;----类型参数只能作参数,不能用作返回值:
{
ICustomerListIn customerList2 = new CustomerListIn();
ICustomerListIn customerList1 = new CustomerListIn();
ICustomerListIn birdList1 = new CustomerListIn();
birdList1.Show(new Sparrow());
birdList1.Show(new Bird());
Action act = new Action((Bird i)=> { });
}
#endregion
}
}
///
/// 鸟
///
public class Bird
{
public int ID { get; set; }
}
///
/// 麻雀
///
public class Sparrow : Bird
{
public string Name { get; set; }
}
public interface ICustomerListOut
{
T Get();
//void Show(T t);
}
public class CustomerListOut : ICustomerListOut
{
public T Get()
{
return default(T);
}
//public void Show(T t)
//{
//}
}
public interface ICustomerListIn
{
//T Get();
void Show(T t);
}
public class CustomerListIn : ICustomerListIn
{
//public T Get()
//{
// return default(T);
//}
public void Show(T t)
{
}
}
内容来源:
https://www.bilibili.com/video/BV1YR4y1L7YE?p=15&spm_id_from=pageDriver&vd_source=98f5b1d1aaf39c81d51a356b2da2f703



