C#中的协变和逆变

在C#中,协变与逆变适用于修饰1泛型委托或是泛型接口的,协变的关键字为out,逆变的关键字为in,添加了out的泛型只能作为返回值来使用,添加了in关键字的泛型只能作为参数来使用。此外,添加了协变与逆变关键字的泛型委托也可以实现类似于里氏替换原则的父子类容器间的互相装载转化。

cs 复制代码
namespace lesson17
{
    delegate T TestOut<out T>();//添加了协变修饰符的泛型只能作为返回值
    delegate void TestIn<in T>(T v);//添加了逆变修符的泛型只能作为参数
    //协变与逆变也可以用在泛型接口中,同样遵循各自的规则
    interface Test<out T> 
    {
        T TestFun();
    }

    class Father { }
    class Son : Father { }
    internal class Program
    {
        static void Main(string[] args)
        {
            //添加了协变的泛型委托可以自动利用里氏替换原则原则,用指定为父类的委托去装载指定为子类的委托
            //即为父类总是能被子类替换,实现由子类到父类的转化
            TestOut<Son> os = () => { return new Son(); };
            TestOut<Father> of = os;
            Father f  = of();//用Father父类装载,实际返回了Son()对象

            //添加了逆变的泛型委托可以自动利用里氏替换原则原则,用指定为子类的委托去装载指定为父类的委托
            //即为子类总是能被父类替换,实现由父类到子类的转化
            TestIn<Father> iF = (value) => { };
            TestIn<Son> iS = iF;
            iS(new Son());//传入了子类对象作为参数,实际调用的是父类委托iF中的逻辑
        }
    }
}
相关推荐
泡海椒32 分钟前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)1 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
2501_933670791 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言
菜鸟~noob2332 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium
白远山2 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
shmily麻瓜小菜鸡4 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
三克的油4 小时前
java-学习1
java·开发语言·学习
星期八不上发条5 小时前
智能指针是什么?使用场景,循环引用解决办法,面试回答
开发语言·c++·stl
tang_04275 小时前
【Hi.Ltd 专题】第7期:Threading 采集线程、锁与 LRU 缓存
经验分享·c#·hi.ltd系列
OKkankan5 小时前
Python 基础进阶(三):从函数、类到 asyncio 与 FastAPI 后端开发实战
开发语言·python