c#学习笔记 协变逆变

本文详细介绍了C#编程中的泛型协变和逆变概念,重点探讨了out和in关键字在泛型接口和委托中的应用,帮助理解父类与子类之间的类型转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协变和逆变是用来修饰泛型字母的,只用在泛型接口和泛型委托中
协变:out ○ 父类装子类
逆变:in ○ 子类装父类

作用:

1. 委托类型
	a. in    修饰的泛型字母,只能作参数
	b. out 修饰的泛型字母,只能作返回值
2. 委托变量
	a. 由有out修饰的委托定义的两个不同类型的委托变量,互相赋值时会自动判断返回值之间是否存在继承关系。
	b.由有in修饰的委托定义的两个不同类型的委托变量,互相赋值时会自动判断对应参数之间是否存在继承关系。
using System;

namespace 协变逆变_委托
{
    // ----------------修饰委托-----------------------------
    delegate T Func1<T> ();
    delegate void Func2<T> (T t);

    delegate T Func_Out<out T> ();
    delegate void Func_In<in T> (T t);
    // delegate T Func0<in T> (); //报错 “T”为 逆变。
    // delegate T Func0<out T> (T t); //报错 “T”为 协变。

    class Father
    {
    }
    class Son : Father
    {
    }

    class Program
    {
        static void Main (string[] args)
        {
            // --------------协变----------------------------------
            //Func1<Son> funcSon = () => new Son();
            //Func1<Father> funcFather = funcSon;
            //报错: 无法将Func<Son>隐式转换为Func<Father>
            // 因为funcSon 和 funcFather 为同级的委托。

            Func_Out<Son> outSon = () => new Son();
            Func_Out<Father> outFather = outSon;
            // 编译通过:加了out后会自动判断返回类型有无继承关系。 (父类装了子类)

            // 从表现上来看,像是父类泛型委托装了子类泛型委托,是和谐的(协变)

            Father father = outFather(); // 返回值为Son转换成的Father类型  (父类装了子类)  
            //Son son = outFather(); 报错 因为返回类型以及是Father了, 子类不能装父类


            // --------------逆变----------------------------------
            //Func2<Father> funcFather = (value) => { };
            //Func2<Son> funcSon = funcFather;
            // 报错 :  无法将Func<Father>隐式转换为Func<Son>  因为funcSon 和 funcFather 为同级的委托。

            Func_In<Father> inFather = (value) => { };
            Func_In<Son> inSon = inFather;
            // 编译通过:加了 in 后会自动判断参数类型有无继承关系。 (父类装了子类)
            inSon(new Son());
            //inSon(new Father());  报错
            
            // 从表现上来看,像是子类泛型委托装了父类泛型委托,是不和谐的(逆变)
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值