協變與逆變

2021-09-10 03:34:53 字數 1214 閱讀 1005

目錄

1.協變

2.逆變

在泛型之前,我們都知道可以將乙個派生類物件賦值給基類變數,這叫做賦值相容性。看下面這個例子

相容性示意圖如上。但是當我們新增泛型機制時:

class animal 

class dog:animal {}

delegate t factory();

class program

static void main()

}

在上面的main函式中,**嘗試吧delegate factory委託型別賦值給felegate factory委託型別的animalmaker變數,此時會出現乙個問題,編譯器提示不能隱式把右邊的型別轉換為左邊的型別。問題在於儘管dog是animal的派生類,但是委託factory沒有從委託factory派生,兩個委託是同級的,他們都是從的delegate型別派生,後者又派生自object型別。

那麼如何解決呢?

如果派生類只是用於輸出值,那麼這種結構化的委託有效性之間的常數關係叫做協變。為了讓編譯器知道這是我們的額期望,必須使用out關鍵字標記委託宣告中的型別引數。即將前面的委託宣告修改為:

delegate t factory();

有了協邊的理解,那麼對於逆變的理解就很容易理解了。對於逆變,只需要把關鍵字out改為in即可。

class animal 

class dog: animal {}

class program

static void main()

}

和之前的請款一樣,預設情況下不可以賦值兩種不相容的型別,但是,如果型別引數只用作委託方法中的輸入引數,就可以。因為即使呼叫**傳入了乙個程度更高的派生類的引用,委託中的方法也只期望乙個程度更低的派生類引用,當然也就仍然能就收並指導如何操作。因此main函式中的第二句能正常執行。

逆變與協變

一 遇到問題 這是基於.net3.5開發,實際工作中遇到乙個問題。假設我們有乙個 base 類,乙個 derived 類,derived 繼承了 base。如下 classbase classderived base 當我用ienumerable作為形參,list作為實參時,發現編譯出錯了!原本父類...

C 協變與逆變

用最簡單的最有內涵的方式進行概括 在oo哲學裡面 有個依賴倒置,這是個oo的核心 就是用父類物件可以代表後面也許動態增加的子類物件從而增加了軟體的,可擴充套件性,和相對穩定性,並且開啟了一種oo正規化 class a class a1 a class a2 a 用a a 這個物件可以表達a1,a2....

協變和逆變

協變和逆變都是術語,前者指能夠使用比原始指定的派生型別的派生程度更大的型別,後者指能夠使用比原始指定的派生型別的派生程度更小的型別。using system using system.collections.generic using system.text class derived base s...