<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文看懂:C#中的協(xié)變和逆變

          共 1724字,需瀏覽 4分鐘

           ·

          2022-02-17 23:46

          前言

          這篇文章簡單說說C#中的協(xié)變和逆變。

          在C#編程中,由于存在類型之間的強制轉(zhuǎn)換,很容易會出現(xiàn)所謂的類型可變性說法,存在協(xié)變、逆變、不變?nèi)N。

          就比如前一篇文章介紹的泛型概念,如果創(chuàng)建了泛型類型的實例,編譯器會接受泛型類型聲明以及類型參數(shù)來創(chuàng)建構(gòu)造類型。但是在日常使用過程中,我們可能會將派生類型分配給基類型的變量,有時候會出現(xiàn)錯誤。

          這里就存在一個賦值兼容性問題。

          每一個變量都有一種類型,可以將派生類對象的實例賦值給基類變量(好比之前子類聲明的變量可以賦值給父類聲明的變量一樣)。

          如下所示:

          ????????class?People
          ????????{
          ????????????public?int?Age?=?27;
          ????????}

          ????????class?AhuiPeople?:?People
          ????????{

          ????????}
          ????????????People?ahui?=?new?People();
          ????????????People?people?=?new?AhuiPeople();

          ????????????Console.WriteLine("Age:"+people.Age);
          ????????????Console.ReadKey();

          協(xié)變和逆變

          我們按照同樣的邏輯,在泛型委托中進行這種強類型的轉(zhuǎn)換,會發(fā)現(xiàn)即使基類和派生類之間可以進行正常的轉(zhuǎn)換,但是委托之間不能進行轉(zhuǎn)換會出現(xiàn)異常錯誤提示。

          具體如下代碼所示:

          ????????delegate?T?AgeDelegate();?????????

          ????????static?AhuiPeople?GetAge()
          ????????{
          ????????????return?new?AhuiPeople();
          ????????}

          在轉(zhuǎn)換過程中,委托的具體用法,但是這樣子編譯器提示錯誤。

          ????????????AgeDelegate?ahui?=?GetAge;
          ????????????AgeDelegate?people?=?ahui;

          錯誤提示

          這就是上面解釋的那樣子,基類和派生類之間可以進行轉(zhuǎn)換但是委托之間未存在關(guān)聯(lián),無法進行強制類型的轉(zhuǎn)換。那么想解決這個問題就引入了協(xié)變來解決。

          如果派生類只是用于輸出值,那么這種結(jié)構(gòu)化的委托有效性之間的常數(shù)關(guān)系叫做協(xié)變,可通過主動告知編譯器我們的期望,使用Out關(guān)鍵字標(biāo)記委托聲明中的類型參數(shù)。

          ????????delegate?T?AgeDelegate();?????????

          修改成這樣子后,上面錯誤演示的代碼編譯器就可以正常編譯通過了。

          上面簡單介紹了協(xié)變,那么接下來我們來看逆變是什么。

          其實逆變就是在委托中既要聲明委托類型,也要在委托方法中有實參。

          這種在期望傳入基類時允許傳入派生對象的特性叫做逆變。逆變使用關(guān)鍵字in來標(biāo)記。

          具體如下代碼所示:

          ????????delegate?void?AgeDelegate<in?T>(T?p);?

          ????????static?void?GetAge(People?p)
          ????????{
          ????????????Console.WriteLine(p.Age);
          ????????}
          ????????????AgeDelegate?ahui?=?GetAge;
          ????????????AgeDelegate?people?=?ahui;

          ????????????people(new?AhuiPeople());
          ????????????Console.WriteLine();
          ????????????Console.ReadKey();

          輸出結(jié)果

          既然協(xié)變和逆變可以使用在委托上,那么接口上也可以使用,此時也需要使用out和in關(guān)鍵字。

          寄語

          人生短暫,我不想去追求自己看不見的,我只想抓住我能看得見的。

          原創(chuàng)不易,給個關(guān)注。

          我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉(zhuǎn)發(fā) ?謝謝。

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久大鸡八三级片 | 成人做爱WWW | 老牛吃嫩一区二区三区 | 天天操夜夜逼 | 欧美射图|