zoukankan      html  css  js  c++  java
  • C# 协变和逆变 精解(直观明了,简单易懂)

    只用于泛型接口或委托

    out 协变, 可用派生程度更大的子类替换父类型的参数,只能用于方法的返回值

    父类本来就可以用子类替换的,但是,在List<父> a=new List<子>();这样的场合就不行了,
    因为List<X>本身没有继承关系的,要用IEnumerable<out T>.

    in 逆变,可用派生程度更小的父类替换子类型参数,只能用于方法的输入参数


    比如
    interface Ix<out TA,in TB>
    {
    TA GetTa(TB tb);
    //如果输入为TA或输出为TB都会编译不过
    }


    in 的具体应用,像API的返回值Result封装场景,
    成功时返回Result<T>,失败时返回Result<object>,
    显示是编译不过的,如果要支持,必须写一个接口IResult<in t>,
    接口中没有任何方法和属性,
    让Result<T>继承自IResult<T>就好了,

    你可能会问,in不是只能做为输入参数么..这里注意,接口里没有写方法,

    是在别的普通类的方法里使用了IResult<T>做返回值,根据业务逻辑决定返回T还是TParent,




    当是out参数的时候,那么它就要求实际的返回对象至少是父类,或者基于T的子类。

    当是in参数的时候:那么他可以T对象实参,也能传T的父类对象实参进去。

  • 相关阅读:
    namespace
    kubernetes环境搭建
    verdaccio私有仓库搭建
    mysql中间件proxysql
    MySQL存储引擎
    关于分布式系统
    转载:ETL讲解
    用原生JS 写Web首页轮播图
    javascript——记忆小便签
    转载:JavaScript 的 this 原理
  • 原文地址:https://www.cnblogs.com/Hexllo/p/2874888.html
Copyright © 2011-2022 走看看