我們知道在C#中,是可以將派生類的實例賦值給基類對象的。
這是沒有什么問題的。下面我們做一些變動。
Dog類不是繼承Animal類么,為什么到這里就不能用了呢?
原來我們都忽略了一點,在這段代碼中dogMarker和animalMarker變量的類型分別是Factory<Dog>和Factory<Animal>他們是沒有繼承關系的,也就是他們是同級別的。因此我們把dogMarker賦值給animalMarker的時候編譯器就報錯了。那么我們如果希望上面的代碼可以正常運行,那要怎么做呢?
還記得在學習參數(shù)的時候有一個關鍵字么——out;如果類型參數(shù)只用作輸出值的話,那么他適用于任何泛型委托。
這種結構化的委托特效之間的關系就叫做協(xié)變。
同樣先來看一段代碼
這次大家知道,報錯肯定是類型不同當然不能賦值了,仔細看異常提示,要怎么實現(xiàn)“逆變”呢?其實只需要一個簡單的關鍵字(in)就能解決了
這種在期望傳入基類時允許傳入派生類對象的特性就是逆變了。
對于協(xié)變與逆變只適用于引用類型,因為值類型沒法派生新的類型。
顯式變化使用in和out關鍵字只適用于委托和接口,類、結構和方法都不適用。
新聞熱點
疑難解答