欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

泛型接口的抗變

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

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

/// <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("測(cè)試成功!");
  }
 }
 /// <summary>
 /// 父類
 /// </summary>
 public class ParentClass
 {
 }
 /// <summary>
 /// 子類
 /// </summary>
 public class SubClass : ParentClass
 {
 }

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

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

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

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

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

   Console.ReadKey();
  }
 }

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

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

好,那我們接下來(lái)給泛型接口修改一下,如下代碼

/// <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。也就是說(shuō)方法的返回類型應(yīng)該是T,而我們Show方法中,方法的參數(shù)是T,所以不符合規(guī)定,報(bào)錯(cuò)。

那我們?cè)賮?lái)修改代碼,如下

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

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

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

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

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

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

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

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

相關(guān)文章

  • C#圖片處理如何生成縮略圖的實(shí)現(xiàn)

    C#圖片處理如何生成縮略圖的實(shí)現(xiàn)

    本文主要介紹了C#圖片處理如何生成縮略圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C# OpenCvSharp實(shí)現(xiàn)通過(guò)特征點(diǎn)匹配圖片

    C# OpenCvSharp實(shí)現(xiàn)通過(guò)特征點(diǎn)匹配圖片

    這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCVSharp4實(shí)現(xiàn)通過(guò)特征點(diǎn)匹配圖片,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下
    2023-11-11
  • C#沉淀之委托的深入講解

    C#沉淀之委托的深入講解

    如果要給方法傳遞一個(gè)方法參數(shù)時(shí),就可以使用委托。下面這篇文章主要給大家介紹了關(guān)于C#沉淀之委托的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • C#使用百度Ueditor富文本框?qū)崿F(xiàn)上傳文件

    C#使用百度Ueditor富文本框?qū)崿F(xiàn)上傳文件

    這篇文章主要為大家詳細(xì)介紹了C#如何使用百度Ueditor富文本框?qū)崿F(xiàn)上傳文件(圖片,視頻等),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-07-07
  • C#匿名函數(shù)和匿名方法的使用

    C#匿名函數(shù)和匿名方法的使用

    本文主要介紹了C#匿名函數(shù)和匿名方法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • HttpWebRequest出錯(cuò).Section=ResponseHeader Detail=CR

    HttpWebRequest出錯(cuò).Section=ResponseHeader Detail=CR

    HttpWebRequest出錯(cuò).Section=ResponseHeader Detail=CR...
    2007-03-03
  • C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)

    C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C#中委托用法

    C#中委托用法

    這篇文章主要介紹了C#中委托用法,實(shí)例分析了C#的定義與使用技巧,需要的朋友可以參考下
    2015-05-05
  • Entity?Framework配置關(guān)系

    Entity?Framework配置關(guān)系

    這篇文章介紹了Entity?Framework配置關(guān)系的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 在.NET?WebService中跨域CORS問(wèn)題的解決方案

    在.NET?WebService中跨域CORS問(wèn)題的解決方案

    在現(xiàn)代的Web應(yīng)用程序開(kāi)發(fā)中,跨域資源共享(Cross-Origin?Resource?Sharing,?CORS)問(wèn)題是開(kāi)發(fā)者經(jīng)常遇到的一個(gè)挑戰(zhàn),在這篇博客中,我們將深入探討如何在?.NET?WebService?中解決CORS問(wèn)題,幫助開(kāi)發(fā)者順利實(shí)現(xiàn)跨域請(qǐng)求,需要的朋友可以參考下
    2024-05-05

最新評(píng)論