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

圖文詳解C#中的協(xié)變與逆變

 更新時間:2022年02月06日 09:28:26   作者:阿輝  
“協(xié)變”是指能夠使用與原始指定的派生類型相比,派生程度更大的類型,“逆變”則是指能夠使用派生程度更小的類型,這篇文章主要給大家介紹了關(guān)于C#中協(xié)變與逆變的相關(guān)資料,需要的朋友可以參考下

前言

這篇文章簡單說說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<T>();         
 
        static AhuiPeople GetAge()
        {
            return new AhuiPeople();
        }

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

            AgeDelegate<AhuiPeople> ahui = GetAge;
            AgeDelegate<People> people = ahui;

錯誤提示

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

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

        delegate T AgeDelegate<out T>();   

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

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

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

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

具體如下代碼所示:

        delegate void AgeDelegate<in T>(T p); 
        static void GetAge(People p)
        {
            Console.WriteLine(p.Age);
        }
            AgeDelegate<People> ahui = GetAge;
            AgeDelegate<AhuiPeople> people = ahui;
 
            people(new AhuiPeople());
            Console.WriteLine();
            Console.ReadKey();

輸出結(jié)果

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

總結(jié)

到此這篇關(guān)于C#中協(xié)變與逆變的文章就介紹到這了,更多相關(guān)C#協(xié)變與逆變內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# winform 解決PictureBox 無法打印全部圖片的問題

    c# winform 解決PictureBox 無法打印全部圖片的問題

    這篇文章主要介紹了c# winform 解決PictureBox 無法打印全部圖片的問題,幫助大家更好進行c# winform開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • .net后臺獲取html控件值的2種方法

    .net后臺獲取html控件值的2種方法

    .net后臺獲取html控件值的2種方法,需要的朋友可以參考一下
    2013-04-04
  • C#中的IEnumerable簡介及簡單實現(xiàn)實例

    C#中的IEnumerable簡介及簡單實現(xiàn)實例

    這篇文章主要介紹了C#中的IEnumerable簡介及簡單實現(xiàn)實例,本文講解了IEnumerable一些知識并給出了一個簡單的實現(xiàn),需要的朋友可以參考下
    2015-03-03
  • C#使用正則表達式過濾html標簽

    C#使用正則表達式過濾html標簽

    最近在開發(fā)一個項目,其中有需求要求我們把一段html轉(zhuǎn)換為一般文本返回,使用正則表達式是明智的選擇,下面小編給介紹下C#使用正則表達式過濾html標簽,需要的朋友參考下
    2016-08-08
  • winform實現(xiàn)限制及解除鼠標移動范圍的方法

    winform實現(xiàn)限制及解除鼠標移動范圍的方法

    這篇文章主要介紹了winform實現(xiàn)限制及解除鼠標移動范圍的方法,涉及C#控制WinForm鼠標事件屬性的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C#判斷單詞個數(shù)方法總結(jié)

    C#判斷單詞個數(shù)方法總結(jié)

    我們給大家總計了C#中判斷英文單詞個數(shù)的方法以及排序的技巧,對此有需要的朋友可以測試下。
    2018-03-03
  • C#利用FluentFTP實現(xiàn)FTP上傳下載功能詳解

    C#利用FluentFTP實現(xiàn)FTP上傳下載功能詳解

    FTP作為日常工作學習中,非常重要的一個文件傳輸存儲空間,想必大家都非常的熟悉了,那么如何快速的實現(xiàn)文件的上傳下載功能呢,本文以一個簡單的小例子,簡述如何通過FluentFTP實現(xiàn)文件的上傳和下載功能
    2023-02-02
  • C#仿Windows XP自帶的掃雷游戲

    C#仿Windows XP自帶的掃雷游戲

    這篇文章主要為大家詳細介紹了C#仿Windows XP自帶的掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#中前臺線程和后臺線程的區(qū)別與聯(lián)系

    C#中前臺線程和后臺線程的區(qū)別與聯(lián)系

    這篇文章主要介紹了C#中前臺線程和后臺線程的區(qū)別與聯(lián)系,本文先講解了它們的區(qū)別,然后給出了一個例子來驗證這些區(qū)別,需要的朋友可以參考下
    2015-06-06
  • 淺談C# StringBuilder內(nèi)存碎片對性能的影響

    淺談C# StringBuilder內(nèi)存碎片對性能的影響

    這篇文章主要介紹了淺談StringBuilder內(nèi)存碎片對性能的影響,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論

翁源县| 浪卡子县| 白沙| 峡江县| 昌图县| 绍兴县| 会理县| SHOW| 通城县| 五华县| 明水县| 汤原县| 马山县| 雅江县| 克什克腾旗| 犍为县| 米脂县| 新郑市| 金乡县| 鄢陵县| 休宁县| 瓦房店市| 香格里拉县| 鲁山县| 葵青区| 宜良县| 秭归县| 包头市| 泰兴市| 同德县| 上蔡县| 大理市| 济宁市| 始兴县| 西充县| 惠水县| 兰考县| 锦屏县| 洪雅县| 双柏县| 清镇市|