C#知識梳理——泛型(2)協(xié)變逆變
1.?? 什么是協(xié)變逆變?
在C#中,協(xié)變(covariance)和逆變(contravariance)是泛型類型參數(shù)的一種特性。它們允許一些類型轉換,使得泛型類型可以在某些情況下更加靈活。
?
協(xié)變(Covariance):協(xié)變允許將一個派生類對象賦值給一個基類對象。在C#中,協(xié)變可以應用于接口和委托類型。例如,如果一個接口定義了一個返回基類對象的方法,那么該接口的實現(xiàn)類可以返回派生類對象。在泛型類型中,使用關鍵字"out"可以標記泛型類型參數(shù)為協(xié)變。例如,IEnumerable<out T> 表示 T 是協(xié)變類型參數(shù)。
?
逆變(Contravariance):逆變允許將一個基類對象賦值給一個派生類對象。在C#中,逆變可以應用于委托類型。例如,如果一個委托類型定義了一個參數(shù)類型為派生類的方法,那么該委托可以接受基類對象作為參數(shù)。在泛型類型中,使用關鍵字"in"可以標記泛型類型參數(shù)為逆變。例如,IComparer<in T> 表示 T 是逆變類型參數(shù)。
簡而言之,協(xié)變是指能夠將一個派生類型的對象分配給一個基類型的引用,而逆變是指能夠將一個基類型的對象分配給一個派生類型的引用。
協(xié)變和逆變可以提供更靈活的類型轉換,使得在一些場景下可以更方便地使用泛型類型。但需要注意的是,協(xié)變和逆變的使用必須符合類型安全的規(guī)則,否則會導致編譯錯誤。在使用協(xié)變和逆變時,應仔細考慮類型的繼承關系,以確保類型的兼容性和正確性。
協(xié)變和逆變是針對接口和泛型委托來說的,離開了它們就沒有這個說法。out關鍵詞代表的是協(xié)變,in關鍵詞代表的是逆變
2.使用情況:在知道自己或者別人以后有用到父類通過子類實例化或者子類通過父類實例化

怎么解決這個問題?——協(xié)變逆變
泛型小總結:
1、 泛型的用處—讓泛型類、泛型方法、泛型接口、泛型委托更通用。減少代碼量。
2、 次要點:--約束 用的不是很多 但是會使得代碼的安全性提升很多
3、 協(xié)變逆變—最重要的是能讀懂源碼里的協(xié)變逆變 當然協(xié)變逆變可以用其他方法代替