最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 泛型接口的抗變和協(xié)變

 更新時(shí)間:2017年03月30日 10:09:21   作者:醉秋風(fēng)  
本篇文章主要介紹了C#中泛型接口的抗變和協(xié)變的相關(guān)知識。具有很好的參考價(jià)值,下面跟著小編一起來看下吧

1, 泛型接口的協(xié)變

如果泛型類型用out關(guān)鍵字標(biāo)注,泛型接口就是協(xié)變的。這也意味著返回類型只能是T。

泛型接口的抗變

如果泛型類型用in關(guān)鍵字標(biāo)注,泛型接口就是抗變的。這樣,接口只能把泛型類型T用作其方法的輸入,即方法的參數(shù)。

這是泛型接口的抗變和協(xié)變的定義,那我們下面來用代碼說明,直接上代碼,

/// <summary>
 /// 泛型接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IDisplay< T >
 {
  void Show(T item);
 }
 /// <summary>
 /// 實(shí)現(xiàn)泛型接口IDisaplay
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public class ShapDisplay<T> : IDisplay<T>
 {
  public void Show(T item)
  {
   Console.WriteLine("測試成功!");
  }
 }
 /// <summary>
 /// 父類
 /// </summary>
 public class ParentClass
 {
 }
 /// <summary>
 /// 子類
 /// </summary>
 public class SubClass : ParentClass
 {
 }

2, 上面定義了接口和實(shí)現(xiàn)了接口,接下來我們來測試實(shí)現(xiàn)了接口的類,上代碼

class Program
 {
  static void Main(string[] args)
  {
   // 用子類實(shí)例化泛型類(簡稱子類對象)
   IDisplay<SubClass> sub1 = new ShapDisplay<SubClass>();

   // 用父類實(shí)例化泛型類(簡稱父類對象)
   IDisplay<ParentClass> par1 = new ShapDisplay<ParentClass>();

   // 用父類類型接收子類對象(子類對象→父類類型)協(xié)變
   IDisplay<ParentClass> parent = sub1;

   // 用子類類型接收父類對象(父類對象→子類類型)抗變
   IDisplay<SubClass> sub = par1;

   Console.ReadKey();
  }
 }

我們會(huì)發(fā)現(xiàn)代碼行12和15會(huì)報(bào)錯(cuò),編譯不過,為什么呢?

原因很簡單,因?yàn)槲覀冊谧钌厦媸沁@樣定義接口的時(shí)候,沒有加out也沒有加in,即泛型接口默認(rèn)不會(huì)支持抗變和協(xié)變,所以編譯會(huì)報(bào)錯(cuò)。

好,那我們接下來給泛型接口修改一下,如下代碼

/// <summary>
 /// 泛型接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IDisplay<out T>
 {
  void Show(T item);
 }

泛型前面加上out之后,會(huì)發(fā)現(xiàn)接口中的Show會(huì)報(bào)錯(cuò),這又是為何呢?

根據(jù)泛型接口的協(xié)變,如果泛型類型用out關(guān)鍵字標(biāo)注,這意味著返回類型只能是T。也就是說方法的返回類型應(yīng)該是T,而我們Show方法中,方法的參數(shù)是T,所以不符合規(guī)定,報(bào)錯(cuò)。

那我們再來修改代碼,如下

/// <summary>
 /// 泛型接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IDisplay<in T>
 {
  void Show(T item);
 }

接口完全沒問題,但是,囧,main方法中12行依然報(bào)錯(cuò),wtf?

因?yàn)榉盒皖愋褪怯胕n來標(biāo)注的,這表示該泛型只支持抗變,12行代碼是協(xié)變,所以會(huì)報(bào)錯(cuò)。

到此,泛型接口的抗變和協(xié)變也就解釋完畢,總結(jié)如下3點(diǎn),

①泛型接口,如果泛型類型前沒有關(guān)鍵字out或者in來標(biāo)注,則該泛型接口不支持抗變和協(xié)變,即只能是什么對象指向什么類型。

②如果泛型接口,泛型類型前有關(guān)鍵字out標(biāo)注,則表示其方法的輸出為T類型,也就是方法的返回值。同時(shí)該泛型接口支持協(xié)變,即,可以用父類的類型指向子類的對象。

③如果泛型接口,泛型類型前面有關(guān)鍵字in標(biāo)注,則表示其方法的輸入為T類型,也就是方法的參數(shù)。該泛型接口支持抗變,也就是可以用子類的類型指向父類的對象。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • C#刪除字符串中重復(fù)字符的方法

    C#刪除字符串中重復(fù)字符的方法

    這篇文章主要介紹了C#刪除字符串中重復(fù)字符的方法,涉及C#針對字符串的遍歷及移除等操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解

    C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解

    這篇文章主要為大家介紹了C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-12-12
  • C#實(shí)現(xiàn)獲取機(jī)器碼的示例詳解

    C#實(shí)現(xiàn)獲取機(jī)器碼的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)獲取機(jī)器碼的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#異步編程詳解

    C#異步編程詳解

    本文主要介紹異步編程中Task、Async和Await的基礎(chǔ)知識。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • C#數(shù)組初始化簡析

    C#數(shù)組初始化簡析

    C#數(shù)組與其它C系列語言有著很多的不同,以前接觸的時(shí)候理解出現(xiàn)很大的偏差。尤其是對多維數(shù)組的認(rèn)識,本文將詳細(xì)介紹C#數(shù)組初始化,需要的朋友可以參考下
    2012-11-11
  • 如何用.NETCore操作RabbitMQ

    如何用.NETCore操作RabbitMQ

    這篇文章主要介紹了如何用.NETCore操作RabbitMQ,對中間件感興趣的同學(xué),可以參考下
    2021-05-05
  • C#實(shí)現(xiàn)3D效果完整實(shí)例

    C#實(shí)現(xiàn)3D效果完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)3D效果的方法,結(jié)合完整實(shí)例形式分析了C#實(shí)現(xiàn)文字3D顯示效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • C#使用DevExpress中的XtraCharts控件實(shí)現(xiàn)圖表

    C#使用DevExpress中的XtraCharts控件實(shí)現(xiàn)圖表

    這篇文章介紹了C#使用DevExpress中的XtraCharts控件實(shí)現(xiàn)圖表的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C# 設(shè)計(jì)模式系列教程-裝飾模式

    C# 設(shè)計(jì)模式系列教程-裝飾模式

    每個(gè)裝飾對象只關(guān)心自己的功能,不需要關(guān)心如何被添加到對象鏈當(dāng)中。它是由Decorator的SetComponent方法來實(shí)現(xiàn)的,因而它們的職責(zé)是單一的。
    2016-06-06
  • C#獲取任務(wù)欄顯示進(jìn)程的方法

    C#獲取任務(wù)欄顯示進(jìn)程的方法

    這篇文章主要介紹了C#獲取任務(wù)欄顯示進(jìn)程的方法,涉及C#針對進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08

最新評論

红安县| 民和| 宁津县| 梅河口市| 普陀区| 名山县| 高台县| 建湖县| 云霄县| 灵台县| 米易县| 新乡市| 马边| 长沙市| 称多县| 商城县| 湛江市| 盐亭县| 衡阳县| 剑河县| 龙泉市| 娄底市| 惠州市| 德化县| 榆中县| 柯坪县| 曲靖市| 平阳县| 乐都县| 和龙市| 通河县| 阿拉善右旗| 开江县| 嘉义市| 夏津县| 湛江市| 宜黄县| 隆林| 左贡县| 襄垣县| 乌恰县|