国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

一篇文章看懂C#中的協變、逆變

2020-01-24 00:02:51
字體:
來源:轉載
供稿:網友

1. 基本概念

官方:協變和逆變都是術語,前者指能夠使用比原始指定的派生類型的派生程度更大(更具體的)的類型,后者指能夠使用比原始指定的派生類型的派生程度更小(不太具體的)的類型。[MSDN]

公式:

          協變:IFoo<父類> = IFoo<子類>;

          逆變:IBar<子類> =  IBar<父類>;

暫時不理解沒關系,您接著往下看。

2. 協變(Covariance)

1) out關鍵字

     對于泛型類型參數,out 關鍵字可指定類型參數是協變的。 可以在泛型接口和委托中使用 out 關鍵字。[MSDN]

2) 魯迅:一張圖勝過千言萬語(圖小看不清,單機鼠標右鍵 -> 在新標簽頁中打開圖片)

   

           備注:泛型委托的協變原理也是一樣的。

        3) 什么是協變?

           協變就是對具體成員的輸出參數進行一次類型轉換,且類型轉換的準則是 “里氏替換原則”。

3. 逆變(Contravariance)

 1) in關鍵字

     對于泛型類型參數,in 關鍵字可指定類型參數是逆變的。 可以在泛型接口和委托中使用 in 關鍵字。[MSDN]

 2) 魯迅:一張圖勝過千言萬語(圖小看不清,單機鼠標右鍵 -> 在新標簽頁中打開圖片)

     

    備注:泛型委托的逆變原理也是一樣的。

        3) 什么是逆變?

            逆變就是對具體成員的輸入參數進行一次類型轉換,且類型轉換的準則是 “里氏替換原則”。

4. 自問自答

1)協變、逆變 為什么只能針對泛型接口或者委托?而不能針對泛型類?

      因為它們都只能定義方法成員(接口不能定義字段),而方法成員在創建對象的時候是不涉及到對象內存分配的,所以它們是類型(內存)安全的。

      為什么不針對泛型?因為泛型類是模板類,而類成員是包含字段的,不同類型的字段是影響對象內存分配的,沒有派生關系的類型它們是不兼容的,也是內存不安全的。

2)協變、逆變 為什么是類型安全的?

      本質上是里氏替換原則,由里氏替換原則可知:派生程度小的是派生程度大的子集,所以子類替換父類的位置整個程序功能都不會發生改變。

3)官方對 協變、逆變 的定義現在是否能看懂?

      上面看懂了,官方定義肯定也是沒問題的。派生程度小可以理解為基類,派生程度大可以理解為子類或派生類,至于為什么用程度這個詞,是因為繼承鏈的深度是沒限制的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山东| 浏阳市| 普安县| 云梦县| 雅安市| 曲水县| 钟山县| 财经| 古丈县| 韩城市| 苗栗市| 札达县| 辉南县| 昌乐县| 阜宁县| 清流县| 庆安县| 五台县| 额尔古纳市| 霸州市| 山东| 望都县| 白河县| 长岭县| 吉安县| 武威市| 乐昌市| 剑阁县| 邮箱| 孝昌县| 宝清县| 广德县| 湖南省| 肇东市| 信丰县| 民乐县| 辛集市| 新蔡县| 栾川县| 海门市| 涪陵区|