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<Bird> birdlist1 = new List<Bird>();//一堆鸟就是一堆鸟
List<Bird> birdlist2 = new List<Sparrow>(); //报错:一堆麻雀是一堆鸟不成立(1.泛型的缺陷)
//为什么报错:
//1.List<Bird> 是个类
//2.List<Sparrow> 也是一个类
//3.这两者没有父子关系---从C#语法上来讲,不能这样写
List<Bird> birdlist3 = new List<Sparrow>().Select(c => (Bird)c).ToList();
}
//接口间的协变与逆变,委托之间的协变与逆变,out in 关键字
//协变---可以让左边使用父类,类型参数使用 out来修饰----类型参数只能做返回值,不能做参数
{
IEnumerable<Bird> birdlist1 = new List<Bird>();
IEnumerable<Bird> birdlist2 = new List<Sparrow>();
//List 继承自 IEnumerable,List与IEnumerable是父子类关系
Func<Bird> func = new Func<Sparrow>(() => { return null; });
ICustomerListOut<Bird> customerList1 = new CustomerListOut<Bird>();
ICustomerListOut<Bird> customerList2 = new CustomerListOut<Sparrow>();
}
//逆变--in--可以让左边使用子类:类型参数使用in修饰;----类型参数只能作参数,不能用作返回值:
{
ICustomerListIn<Sparrow> customerList2 = new CustomerListIn<Sparrow>();
ICustomerListIn<Sparrow> customerList1 = new CustomerListIn<Bird>();
ICustomerListIn<Bird> birdList1 = new CustomerListIn<Bird>();
birdList1.Show(new Sparrow());
birdList1.Show(new Bird());
Action<Sparrow> act = new Action<Bird>((Bird i)=> { });
}
#endregion
}
}
/// <summary>
/// 鸟
/// </summary>
public class Bird
{
public int ID { get; set; }
}
/// <summary>
/// 麻雀
/// </summary>
public class Sparrow : Bird
{
public string Name { get; set; }
}
public interface ICustomerListOut<out T>
{
T Get();
//void Show(T t);
}
public class CustomerListOut<T> : ICustomerListOut<T>
{
public T Get()
{
return default(T);
}
//public void Show(T t)
//{
//}
}
public interface ICustomerListIn<in T>
{
//T Get();
void Show(T t);
}
public class CustomerListIn<T> : ICustomerListIn<T>
{
//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