溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中的協(xié)變與逆變怎么實現(xiàn)

發(fā)布時間:2022-02-07 09:56:18 來源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“C#中的協(xié)變與逆變怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

前言

在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();

C#中的協(xié)變與逆變怎么實現(xiàn)

協(xié)變和逆變

我們按照同樣的邏輯,在泛型委托中進(jìn)行這種強類型的轉(zhuǎn)換,會發(fā)現(xiàn)即使基類和派生類之間可以進(jìn)行正常的轉(zhuǎn)換,但是委托之間不能進(jì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;

錯誤提示

C#中的協(xié)變與逆變怎么實現(xiàn)

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

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

        delegate T AgeDelegate<out T>();

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

C#中的協(xié)變與逆變怎么實現(xiàn)

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

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

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

具體如下代碼所示:

        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é)果

C#中的協(xié)變與逆變怎么實現(xiàn)

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

“C#中的協(xié)變與逆變怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI