<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一句話清晰總結協變和逆變

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

      我們先來看一段MSDN原文給協變,逆變和變體下個定義:

      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.

      如果泛型接口或委托的泛型參數聲明為協變或逆變,則將該泛型接口或委托稱為變體 C# Visual Basic 都允許您創建自己的變體接口和委托。

      通俗解釋:

      變體定義:帶有協變或逆變參數的泛型接口或委托。也就是說協變和逆變主要關注點在泛型接口或委托。

      那什么又是協變和逆變呢?

      我們先來看下面一個來自MSDN的例子:

       

      1 // 協變
      2 IEnumerable<string>strings = new List<string>();
      3 IEnumerable<object> objects = strings;
       

      大家看到了么一個聲明為IEnumerable<string> 接口類型被賦給了一個更低 級別的IEnumerable<object>.

      對,這就是協變。再來看一個例子:

       

       

      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>接口是協變的,所以PrintBases(IEnumerable<Base> bases)

                                        //可以接收一個更加具體化的IEnumerable<Derived>作為其參數。

              IEnumerable<Base> bIEnum = dlist;

          }

      }

      下面給協變下個定義:

      協變:讓一個帶有協變參數的泛型接口(或委托)可以接收類型更加精細化,具體化的泛型接口(或委托)作為參數,可以看成OO中多態的一個延伸。

       

      // 逆變
      // 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>接收參數,沒有返回值,所以其中的objectstring是其參數,這個過程其實就是參數的約束更加強了,也就是說讓參數類型更加精細化。下面我們來給逆變下個定義:

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

       

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

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

       

       

       

      posted @ 2011-11-09 13:32  SolidMango  閱讀(14860)  評論(30)    收藏  舉報
      主站蜘蛛池模板: 日韩av一区二区三区精品| 久热这里只有精品在线观看| 99国产精品自在自在久久| 福利一区二区在线视频| 色成人精品免费视频| 欧美三级在线播放| 中文字幕久久六月色综合| 依依成人精品视频在线观看| 国产成AV人片久青草影院| 一个人看的www视频免费观看| 国产精品熟女孕妇一区二区| 中文字幕日韩有码第一页| 国产精品亚洲综合色区丝瓜| 国产精品亚洲欧美大片在线看 | 国产精品疯狂输出jk草莓视频| 少妇的丰满3中文字幕| 国产精品久久自在自线不卡| 2019国产精品青青草原| 2021国产成人精品久久| 国产精品综合av一区二区国产馆| 亚洲AV日韩AV永久无码下载| 亚洲熟女精品一区二区| 日本真人做爰免费视频120秒| 国产精品老熟女露脸视频| 中文字幕国产精品资源| 国产午夜福利在线视频| 18禁无遮挡啪啪无码网站| 亚洲精品日韩久久精品| 成人av天堂男人资源站| 久久天天躁狠狠躁夜夜躁2o2o| 国产精品入口麻豆| 欧美日韩国产码高清| 中文字幕在线精品人妻| brazzers欧美巨大| 伊人久久大香线蕉aⅴ色| 日韩成人高精品一区二区| 特级av毛片免费观看| 日韩一区二区三区av在线| 国产精品久久久久7777| 国产男女猛烈无遮挡免费视频| 亚洲一区成人av在线|