c#协变与逆变

本文介绍了C#中泛型的协变和逆变概念,包括in和out关键字的使用规则。通过示例展示了如何使用这两个关键字实现类型安全的转换,以及在方法参数和返回值中的应用。同时,代码示例演示了逆变和协变在类继承中的作用,符合里式替换原则。
摘要由CSDN通过智能技术生成

逆变:子类变成父类

协变:父类变成子类

in和out:只能用来修饰委托和接口 类和结构体不行

in:只能当做参数 逆变

out:只能当做返回值,不能当形参 协变

以下都是错误的:

delegate T TestIn<in T>(T t); //不能返回T类型delegate T TestOut<out T>(T tem); //T类型不能当做形参

作用:

1 out修饰的的泛型类型,只能作为返回值类型,in修饰的泛型类型,只能作为参数类型

2 遵循里式替换原则 用他们来修饰的泛型可以相互装载前提是具有父子关系

举例:

    delegate void TestIn<in T>(T t);
    delegate T TestOut<out T>();
    class Father{}
    class Son : Father{}
    
    class Program
    {
        static void Main(string[] args)
        {
            //协变 父类总是能被子类替换 不加out关键字下面就报错
            TestOut<Son> os = () => { return new Son(); };
            TestOut<Father> of = os;
             

            //逆变 子类可以装父类
            TestIn<Father> IF = (value) => { };          
            TestIn<Son> IS = IF;
            IS(new Son());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值