程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#協變和逆變,

C#協變和逆變,

編輯:C#入門知識

C#協變和逆變,


  我們知道在C#中,是可以將派生類的實例賦值給基類對象的。

  這是沒有什麼問題的。下面我們做一些變動。

協變

  Dog類不是繼承Animal類麼,為什麼到這裡就不能用了呢?

  原來我們都忽略了一點,在這段代碼中dogMarker和animalMarker變量的類型分別是Factory<Dog>和Factory<Animal>他們是沒有繼承關系的,也就是他們是同級別的。因此我們把dogMarker賦值給animalMarker的時候編譯器就報錯了。那麼我們如果希望上面的代碼可以正常運行,那要怎麼做呢?

  還記得在學習參數的時候有一個關鍵字麼——out;如果類型參數只用作輸出值的話,那麼他適用於任何泛型委托。

  這種結構化的委托特效之間的關系就叫做協變。

逆變

同樣先來看一段代碼

  這次大家知道,報錯肯定是類型不同當然不能賦值了,仔細看異常提示,要怎麼實現“逆變”呢?其實只需要一個簡單的關鍵字(in)就能解決了

這種在期望傳入基類時允許傳入派生類對象的特性就是逆變了。

小結

對於協變與逆變只適用於引用類型,因為值類型沒法派生新的類型。

顯式變化使用in和out關鍵字只適用於委托和接口,類、結構和方法都不適用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved