91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C#中的協變和逆變是什么

發布時間:2021-08-25 17:34:52 來源:億速云 閱讀:157 作者:chen 欄目:編程語言

本篇內容介紹了“C#中的協變和逆變是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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)官方對 協變、逆變 的定義現在是否能看懂?

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

“C#中的協變和逆變是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赤水市| 武清区| 罗城| 腾冲县| 大同市| 乌苏市| 本溪市| 神池县| 玉林市| 武夷山市| 菏泽市| 民和| 广州市| 寻甸| 长海县| 衡东县| 库车县| 临汾市| 恩施市| 鹤山市| 师宗县| 博乐市| 酒泉市| 高雄县| 皋兰县| 香河县| 乌审旗| 阿克苏市| 广河县| 郧西县| 沈丘县| 兴国县| 宁国市| 陈巴尔虎旗| 内江市| 柘城县| 融水| 娄底市| 客服| 青阳县| 江永县|