亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

我們先來看一段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é)變和逆變主要關(guān)注點(diǎn)在泛型接口或委托。

那什么又是協(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ù)的泛型接口(或委托)可以接收類型更加精細(xì)化,具體化的泛型接口(或委托)作為參數(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中以后要使用更加精細(xì)化的類型string不能再使用object啦!
string strHello(“Hello”); 
actString(strHello);

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

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

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

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

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

相關(guān)文章

最新評論