C 中的協變和抗變

2021-09-24 14:52:08 字數 732 閱讀 7676

.net4通過協變和抗變為泛型介面和泛型委託新增了乙個重要擴充套件。協變和抗變指對引數和返回值的型別進行轉換。

在.net中,引數型別是協變的。假定有 shape和 rectangle 類,rectangle 派生自shape基類。宣告display() 方法是為了接受 shape型別的物件作為其引數 :

public void display(shape 0){}
現在可以傳遞派生 自shape基類的任意物件。 因為 rectangle 派 生自shape,所 以rectangle 滿足 shape的 所有要求,編譯器接受這個方法呼叫 :

rectangle r = new rectangle {}width= 5` height=2.5};

display®;

方法的返回型別是抗變的。 當方法返回乙個 shape時,不能把它賦予 rectangle ,因 為 shape不

一定總是 rectangle 。 反過來是可行的:如 果乙個方法像 gerectangle ()方 法那樣返回乙個 rectangle ,

public rectangle  getrectangle ();
就可以把結果賦予某個 shape:

在.net framework4版 本之前,這種行為方式不適用於泛型。在c#4中 ,擴充套件後的語言支援泛

型介面和泛型委託的協變和抗變。

c 協變和抗變 C 中協變與抗變(逆變)

泛型在.net 2.0中正式的引入。在使用泛型的過程中,聯絡上物件導向的繼承性。往往很容易想當然敲出類似以下 list animallst new list 顯然這樣編譯是不通過的。雖然dog和animal之間有繼承性,但是list和list這兩個類之間並沒有繼承性。如果要解決這樣的問題,用上協變與...

C 中協變抗變之我見

在.net4.0中,新加入了協變與抗變的內容,最近查了一下msdn,對它有了乙個大概的理解,希望能夠幫助到和我一樣的菜鳥。協變 協變非常類似於普通的多型性的分配,它是針對成員的返回值型別,定義時使用關鍵字out,假定您有乙個名為 base 的基類和乙個名為 derived 的派生類 ienumera...

C 中的協變與抗變

using system using system.collections.generic using system.linq using system.text namespace csharp基礎 else console.readline 按照委託簽名,但返回的是子類的例項 public st...