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中的逻辑
        }
    }
}
相关推荐
leonkay42 分钟前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
harmful_sheep1 小时前
java group by常见用法
java·开发语言·python
SKH.1 小时前
Linux软件编程(6)线程间通信
java·开发语言·数据库
whcyhhh1 小时前
头歌实践教学平台:数据科学与大数据技术导论(十六)
大数据·开发语言·python
萌动的小火苗1 小时前
数据结构面试题【无答案】
c语言·开发语言·数据结构·链表
宸津-代码粉碎机1 小时前
AI工程化高阶实战|从Demo到生产落地核心架构、全套源码与避坑指南
java·大数据·开发语言·人工智能·python·架构
CSDN_RTKLIB2 小时前
数据库七大符号表
c#
XR1234567882 小时前
办公网自主创新建设怎么选?信创办公场景的选型逻辑
开发语言·php
leonkay2 小时前
C# 特性(Attribute)——【2】工业设备参数框架设计
经验分享·面试·架构·c#·学习方法·设计
郝学胜-神的一滴2 小时前
Effective Python 条款4:字符串格式化大乱斗
开发语言·网络·python·程序人生·软件工程