協變和逆變之疑問

2021-09-07 01:33:50 字數 1630 閱讀 1476

關於協變和逆變已經有很多園友談論過了,學習時也參考過園友們的文章,非常之到位!尤其是園友lovejenny的,參看時自己也有敲**加理解,但是出現乙個問題,甚是不解,請看下面。【注】這個問題可能對您而言很簡單,若有解釋,請告知,在此感謝。高手繞道!

既然是標題是協變和逆變,還是先給個公認的msdn概念吧。說完概念直接進入問題區。

1

public

class

employee25

6public

class

programmer : employee

7

1

inte***ce isalary26

7public

class basesalarycounter: isalary8

1314

public

void

otherpay(t t)

1518 }

isalarypro = new basesalarycounter();

isalary

emp = pro;

毫無疑問出現錯誤,如下:【注】若不明白錯誤原因請參考園友lovejenny文章

/*定義介面*/2

public

inte***ce imycomparable36

/*employee為基類並實現其介面*/7

public

class employee : imycomparable8

10public

intcompare(employee other)

1114}15

16/*

programmer繼承employee並實現其介面

*/17

public

class programmer : employee, imycomparable1824}

2526

/*manager繼承employee

*/27

public

class

manager : employee

2831

32/*

定義方法

*/33

34static

void test(imycomparablet1, t t2)

3538

39/*

呼叫*/

4041 programmer p = new programmer() ;

42 manager m = new manager() ;

43 test(p, m);

協變和逆變

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

協變和逆變

二 真正的協變和逆變 概念 1 以前的泛型系統 或者說沒有in out關鍵字時 是不能 變 的,無論是 逆 還是 順 協 2 當前僅支援介面和委託的逆變與協變 不支援類和方法。但陣列也有協變性。3 值型別不參與逆變與協變。協變 foo foo public class testoutwhere t ...

協變和逆變

假設有這樣乙個類 class person icloneable 但是由於我們知道是返回乙個person類的例項,所以返回型別 object 寫在這裡總會覺得很彆扭,我們希望寫成 class person icloneable 顯然,這是錯的 雖然這是錯的,但這就是返回型別的協變性,只是非泛型介面和...