• 泛型的逆变与斜变


    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
         {

        }
    }

  • 相关阅读:
    html调用php
    MySQL安装下载
    MySQL默认安装下载
    MySQL安装下载
    搭建php环境
    面试官:聊聊对Vue.js框架的理解
    TCP、UDP、HTTP、SOCKET之间的区别与联系
    HTTP/1、HTTP/2、HTTP/3
    git教程
    从jQuery到Serverless,前端十四年挖了多少坑?
  • 原文地址:https://www.cnblogs.com/xtxtx/p/10669326.html
Copyright © 2020-2023  润新知