C#知识梳理——泛型(2)协变逆变
1. 什么是协变逆变?
在C#中,协变(covariance)和逆变(contravariance)是泛型类型参数的一种特性。它们允许一些类型转换,使得泛型类型可以在某些情况下更加灵活。
协变(Covariance):协变允许将一个派生类对象赋值给一个基类对象。在C#中,协变可以应用于接口和委托类型。例如,如果一个接口定义了一个返回基类对象的方法,那么该接口的实现类可以返回派生类对象。在泛型类型中,使用关键字"out"可以标记泛型类型参数为协变。例如,IEnumerable<out T> 表示 T 是协变类型参数。
逆变(Contravariance):逆变允许将一个基类对象赋值给一个派生类对象。在C#中,逆变可以应用于委托类型。例如,如果一个委托类型定义了一个参数类型为派生类的方法,那么该委托可以接受基类对象作为参数。在泛型类型中,使用关键字"in"可以标记泛型类型参数为逆变。例如,IComparer<in T> 表示 T 是逆变类型参数。
简而言之,协变是指能够将一个派生类型的对象分配给一个基类型的引用,而逆变是指能够将一个基类型的对象分配给一个派生类型的引用。
协变和逆变可以提供更灵活的类型转换,使得在一些场景下可以更方便地使用泛型类型。但需要注意的是,协变和逆变的使用必须符合类型安全的规则,否则会导致编译错误。在使用协变和逆变时,应仔细考虑类型的继承关系,以确保类型的兼容性和正确性。
协变和逆变是针对接口和泛型委托来说的,离开了它们就没有这个说法。out关键词代表的是协变,in关键词代表的是逆变
2.使用情况:在知道自己或者别人以后有用到父类通过子类实例化或者子类通过父类实例化

怎么解决这个问题?——协变逆变
泛型小总结:
1、 泛型的用处—让泛型类、泛型方法、泛型接口、泛型委托更通用。减少代码量。
2、 次要点:--约束 用的不是很多 但是会使得代码的安全性提升很多
3、 协变逆变—最重要的是能读懂源码里的协变逆变 当然协变逆变可以用其他方法代替