一句話清晰總結C#的協(xié)變和逆變
看到過幾篇協(xié)變和逆變的文章,但是總覺得寫得不夠清晰,文章這東西注重要是要把自己想表達的觀點表達出來,這個過程應該是把復雜的東西消化出來從而簡單化,清晰化,而不是故弄玄虛,反其道而行之,下面我們言歸正傳啦。
我們先來看一段MSDN原文給協(xié)變,逆變和變體下個定義:
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é)變或逆變,則將該泛型接口或委托稱為“變體”。 C# 和 Visual Basic 都允許您創(chuàng)建自己的變體接口和委托。
通俗解釋:
變體定義:帶有協(xié)變或逆變參數(shù)的泛型接口或委托。也就是說協(xié)變和逆變主要關注點在泛型接口或委托。
那什么又是協(xié)變和逆變呢?
我們先來看下面一個來自MSDN的例子:
1 // 協(xié)變
2 IEnumerable<string>strings = new List<string>();
3 IEnumerable<object> objects = strings;
大家看到了么一個聲明為IEnumerable<string>的 接口類型被賦給了一個更低 級別的IEnumerable<object>.
對,這就是協(xié)變。再來看一個例子:
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) ?????????????????????????????? ?? //可以接收一個更加具體化的IEnumerable<Derived>作為其參數(shù)。 ??????? IEnumerable<Base> bIEnum = dlist; ??? } }
下面給協(xié)變下個定義:
協(xié)變:讓一個帶有協(xié)變參數(shù)的泛型接口(或委托)可以接收類型更加精細化,具體化的泛型接口(或委托)作為參數(shù),可以看成OO中多態(tài)的一個延伸。
// 逆變 // Assume that the following method is in the class: // static void SetObject(object o) { } Action<object> actObject = SetObject; Action<string> actString = actObject; //委托actString中以后要使用更加精細化的類型string不能再使用object啦! string strHello(“Hello”); actString(strHello);
大家看到了么?一個聲明為Action<object>的類型被賦給了一個Action<string>,大家都知道,Action<T>接收參數(shù),沒有返回值,所以其中的object和string是其參數(shù),這個過程其實就是參數(shù)的約束更加強了,也就是說讓參數(shù)類型更加精細化。下面我們來給逆變下個定義:
逆變:讓一個帶有協(xié)變參數(shù)的泛型接口(或委托)可以接收粒度更粗的泛型接口或委托作為參數(shù),這個過程實際上是參數(shù)類型更加精細化的過程。
一句話總結:協(xié)變讓一個粗粒度接口(或委托)可以接收一個更加具體的接口(或委托)作為參數(shù)(或返回值);逆變讓一個接口(或委托)的參數(shù)類型(或返回值)類型更加具體化,也就是參數(shù)類型更強,更明確。
通常,協(xié)變類型參數(shù)可用作委托的返回類型,而逆變類型參數(shù)可用作參數(shù)類型。 對于接口,協(xié)變類型參數(shù)可用作接口的方法的返回類型,而逆變類型參數(shù)可用作接口的方法的參數(shù)類型。
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
快速解決owin返回json字符串多帶了雙引號"多了重string轉義字符串
下面小編就為大家?guī)硪黄焖俳鉀Qowin返回json字符串多帶了雙引號"多了重string轉義字符串。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08C#實現(xiàn)IDisposable接口釋放非托管資源
這篇文章主要為大家介紹了C#實現(xiàn)IDisposable接口釋放非托管資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05.Net多進程通信共享內存映射文件Memory?Mapped
這篇文章主要介紹了.Net多進程通信共享內存映射文件Memory?Mapped的使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04c#使用ManagedWifi查看當前Wifi信號并選擇wifi的示例
這篇文章主要介紹了c#使用ManagedWifi查看當前Wifi信號并選擇wifi的示例,需要的朋友可以參考下2014-04-04C#基于正則表達式刪除字符串中數(shù)字或非數(shù)字的方法
這篇文章主要介紹了C#基于正則表達式刪除字符串中數(shù)字或非數(shù)字的方法,涉及C#針對數(shù)字的簡單正則匹配相關操作技巧,需要的朋友可以參考下2017-06-06