最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一句話清晰總結(jié)C#的協(xié)變和逆變

 更新時(shí)間:2022年10月22日 14:12:01   作者:SolidMango  
這篇文章介紹了C#協(xié)變和逆變的工作原理,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

看到過(guò)幾篇協(xié)變和逆變的文章,但是總覺(jué)得寫(xiě)得不夠清晰,文章這東西注重要是要把自己想表達(dá)的觀點(diǎn)表達(dá)出來(lái),這個(gè)過(guò)程應(yīng)該是把復(fù)雜的東西消化出來(lái)從而簡(jiǎn)單化,清晰化,而不是故弄玄虛,反其道而行之,下面我們言歸正傳啦。

我們先來(lái)看一段MSDN原文給協(xié)變,逆變和變體下個(gè)定義:

A generic interface or delegate is called variant if its generic parameters are declared covariant or contravariant. Both C# and Visual Basic enable you to create your own variant interfaces and delegates.

如果泛型接口或委托的泛型參數(shù)聲明為協(xié)變或逆變,則將該泛型接口或委托稱(chēng)為“變體”。 C# 和 Visual Basic 都允許您創(chuàng)建自己的變體接口和委托。

通俗解釋?zhuān)?/p>

變體定義:帶有協(xié)變或逆變參數(shù)的泛型接口或委托。也就是說(shuō)協(xié)變和逆變主要關(guān)注點(diǎn)在泛型接口或委托。

那什么又是協(xié)變和逆變呢?

我們先來(lái)看下面一個(gè)來(lái)自MSDN的例子:

1 // 協(xié)變
2 IEnumerable<string>strings = new List<string>();
3 IEnumerable<object> objects = strings;

大家看到了么一個(gè)聲明為IEnumerable<string>的 接口類(lèi)型被賦給了一個(gè)更低 級(jí)別的IEnumerable<object>.
對(duì),這就是協(xié)變。再來(lái)看一個(gè)例子:

class Base
{
??? public static void PrintBases(IEnumerable<Base> bases)
??? {
??????? foreach(Base b in bases)
??????? {
??????????? Console.WriteLine(b);
??????? }
??? }
}
?
class Derived : Base
{
??? public static void Main()
??? {
??????? List<Derived> dlist = new List<Derived>();
?
??????? Derived.PrintBases(dlist);//由于IEnumerable<T>接口是協(xié)變的,所以PrintBases(IEnumerable<Base> bases)
?????????????????????????????? ?? //可以接收一個(gè)更加具體化的IEnumerable<Derived>作為其參數(shù)。
??????? IEnumerable<Base> bIEnum = dlist;
??? }
}

下面給協(xié)變下個(gè)定義:

協(xié)變:讓一個(gè)帶有協(xié)變參數(shù)的泛型接口(或委托)可以接收類(lèi)型更加精細(xì)化,具體化的泛型接口(或委托)作為參數(shù),可以看成OO中多態(tài)的一個(gè)延伸。

// 逆變
// Assume that the following method is in the class: 
// static void SetObject(object o) { } 
Action<object> actObject = SetObject;
Action<string> actString = actObject; 
//委托actString中以后要使用更加精細(xì)化的類(lèi)型string不能再使用object啦!
string strHello(“Hello”); 
actString(strHello);

大家看到了么?一個(gè)聲明為Action<object>的類(lèi)型被賦給了一個(gè)Action<string>,大家都知道,Action<T>接收參數(shù),沒(méi)有返回值,所以其中的object和string是其參數(shù),這個(gè)過(guò)程其實(shí)就是參數(shù)的約束更加強(qiáng)了,也就是說(shuō)讓參數(shù)類(lèi)型更加精細(xì)化。下面我們來(lái)給逆變下個(gè)定義:

逆變:讓一個(gè)帶有協(xié)變參數(shù)的泛型接口(或委托)可以接收粒度更粗的泛型接口或委托作為參數(shù),這個(gè)過(guò)程實(shí)際上是參數(shù)類(lèi)型更加精細(xì)化的過(guò)程。

一句話總結(jié):協(xié)變讓一個(gè)粗粒度接口(或委托)可以接收一個(gè)更加具體的接口(或委托)作為參數(shù)(或返回值);逆變讓一個(gè)接口(或委托)的參數(shù)類(lèi)型(或返回值)類(lèi)型更加具體化,也就是參數(shù)類(lèi)型更強(qiáng),更明確。

通常,協(xié)變類(lèi)型參數(shù)可用作委托的返回類(lèi)型,而逆變類(lèi)型參數(shù)可用作參數(shù)類(lèi)型。 對(duì)于接口,協(xié)變類(lèi)型參數(shù)可用作接口的方法的返回類(lèi)型,而逆變類(lèi)型參數(shù)可用作接口的方法的參數(shù)類(lèi)型。

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

最新評(píng)論

井研县| 梨树县| 禄劝| 岫岩| 泰来县| 木兰县| 塘沽区| 迁西县| 横峰县| 新乡县| 临西县| 大同县| 南漳县| 霍山县| 五原县| 准格尔旗| 石家庄市| 北宁市| 前郭尔| 新宾| 张家口市| 元朗区| 三河市| 松潘县| 怀安县| 吉林省| 镇巴县| 镇江市| 靖宇县| 克什克腾旗| 同江市| 闽清县| 通山县| 信丰县| 铅山县| 玉屏| 和平区| 普格县| 张北县| 阜康市| 修水县|