加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

泛型的逆变与斜变

发布时间:2020-12-14 04:34:32 所属栏目:大数据 来源:网络整理
导读:using System; using System.Collections.Generic; namespace CCTest { ???? class Program ???? { ???????? static void Main(string[] args) ???????? { ???????????? Bird bird1 = new Bird(); ???????????? Bird bird2 = new Sparrow(); ??????????? //

using System;
using System.Collections.Generic;

namespace CCTest
{
???? class Program
???? {
???????? static void Main(string[] args)
???????? {
???????????? Bird bird1 = new Bird();
???????????? Bird bird2 = new Sparrow();

??????????? //逆变斜变只作用于接口和委托

??????????? List<Bird> birdlist1 = new List<Bird>();
???????????? //List<Bird> 是个类? List<Sparrow>()也是一个类 没父子关系 所以语法报错
???????????? List<Bird> birdlist2 = new List<Sparrow>();


???????????? //斜变效果: 就是让右边可以用子类? 让泛型用起来更方便
???????????? IEnumerable<Bird> birdlist3 = new List<Bird>();
???????????? IEnumerable<Bird> birdlist4 = new List<Sparrow>();

??????????? //out 斜变 只能是返回结果 不能做参数
???????????? ICustomerListOut<Bird> birdlist5 = new CustomerListOut<Sparrow>();

??????????? //为什么T可以是返回值?
???????????? //接口要求返回一个 Bird 其实现类返回一个 Sparrow,Sparrow继承Bird 所以ok;

??????????? //为什么T不可以是参数?
???????????? //可以想象一下,假设我们这样定义
???????????? // ICustomerListOut<Bird> birdlist5 = new CustomerListOut<Sparrow>();
???????????? //在调用 birdlist5.Show 方法时 其实现类要求传入的是 Sparrow
???????????? //简单讲: 接口定义的是父类,其实现类要求传入一个子类 所以用不成

??????????? {
???????????????? //逆变: 就是让右边可以用父类,让泛型用起来更方便
???????????????? //in 逆变 只能做参数? 不能是返回结果
???????????????? ICustomerListIn<Sparrow> birdlist6 = new CustomerListIn<Bird>();
???????????????? birdlist6.Show(new Sparrow());

??????????????? //为什么T可以是参数?
???????????????? //接口定义一个方法,其传入参数是Sparrow,其实现类调用Show方法 传入Bird,Sparrow时bird 所以可以

??????????????? //为什么T不可以是返回值?
???????????????? //接口要求返回 Sparrow,其实现类返回bird? Bird不是Sparrow 所以不行
???????????? }
???????? }
???? }

??? interface ICustomerListIn<in T>
???? {
???????? void Show(T t);
???????? //T Get();
???? }
???? class CustomerListIn<T> : ICustomerListIn<T>
???? {
???????? public void Show(T t)
???????? {
???????? }
???? }


??? interface ICustomerListOut<out T>
???? {
???????? T Get();
???????? //void Show(T t);
???? }

??? class CustomerListOut<T> : ICustomerListOut<T>
???? {
???????? public T Get()
???????? {
???????????? return default(T);
???????? }
???? }


???? class Bird
???? {

??? }
???? class Sparrow: Bird
???? {

??? } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读