C 協變逆變

2021-09-05 10:41:11 字數 950 閱讀 9421

1.泛型的協變逆變:

注意 :只能放在介面或者委託的泛型引數前面

1).委託泛型引數

static class testconsole);}

private static argumentexception test1(object obj)

private static exception test2(string str)

public static void gentestfather(ienumerablefathers)

}public class father

}public class son : father

2).介面泛型引數

//泛型逆變

icustomerlistincustomerlist1 = new customerlistin();

public inte***ce icustomerlistin

public class customerlistin: icustomerlistin

public void show(t t)

}

2.委託的協變逆變:

將方法繫結到委託時,c#和clr都允許引用型別的協變性和逆變性;

協變性是指方法能返回從委託的返回型別派生的乙個型別。

逆變性是指方法獲取的引數可以是委託的引數型別的基類。

注意:不需要標記out  或 in 

參考clr.via.c# 【初始委託】

3.理解;

為什麼返回值可以接受協變?

黎克特制替換原則,基類出現的地方可以用子類替換。

為什麼引數可以接受逆變?

如果接受了基類引數的方法或者泛型介面例項,然而在引數真正賦實參時,只能接受委託和泛型介面中定義中的型別,也就是父類型別,根據黎克特制替換原則,也是可以的

詳細理解,可參:

c 協變 逆變複習

c 中泛型同c 中的stl基本類似。例子如下 using system class test public static void swap ref t a,ref t b 定義乙個泛型的方法 為了能使泛型介面引用子類物件時使用object型別來接受其它型別的物件,引入協變,例子如下 using s...

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...