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

首頁 > 學院 > 開發設計 > 正文

C#協變和逆變

2019-11-17 02:26:19
字體:
來源:轉載
供稿:網友

C#協變和逆變

  我們知道在C#中,是可以將派生類的實例賦值給基類對象的。

  這是沒有什么問題的。下面我們做一些變動。

協變

  Dog類不是繼承Animal類么,為什么到這里就不能用了呢?

  原來我們都忽略了一點,在這段代碼中dogMarker和animalMarker變量的類型分別是Factory<Dog>和Factory<Animal>他們是沒有繼承關系的,也就是他們是同級別的。因此我們把dogMarker賦值給animalMarker的時候編譯器就報錯了。那么我們如果希望上面的代碼可以正常運行,那要怎么做呢?

  還記得在學習參數的時候有一個關鍵字么——out;如果類型參數只用作輸出值的話,那么他適用于任何泛型委托。

  這種結構化的委托特效之間的關系就叫做協變。

逆變

同樣先來看一段代碼

  這次大家知道,報錯肯定是類型不同當然不能賦值了,仔細看異常提示,要怎么實現“逆變”呢?其實只需要一個簡單的關鍵字(in)就能解決了

這種在期望傳入基類時允許傳入派生類對象的特性就是逆變了。

小結

對于協變與逆變只適用于引用類型,因為值類型沒法派生新的類型。

顯式變化使用in和out關鍵字只適用于委托和接口,類、結構和方法都不適用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁德市| 许昌县| 从江县| 钟山县| 偃师市| 阿合奇县| 建德市| 明光市| 济阳县| 台中县| 宁陕县| 江油市| 通江县| 鄂州市| 新绛县| 黔东| 永顺县| 光泽县| 泸水县| 旬邑县| 龙海市| 乌兰察布市| 兰考县| 马关县| 乌兰浩特市| 张家界市| 克山县| 顺平县| 东光县| 都江堰市| 铁岭县| 平定县| 台中县| 北票市| 泸西县| 墨脱县| 房山区| 安新县| 顺昌县| 武夷山市| 武安市|