C#学习笔记-协变与逆变

1,泛型接口和委托的逆变与协变
核心:
类型转换,参数只应用于引用类型

2,关键字:协变,out
Foo<父类>=Foo<子类>
Ioo<父类>=Ioo<子类>

3,关键字:逆变,in
Foo<子类>=Foo<父类>
Ioo<子类>=Ioo<父类>

返回值协变和参数逆变

    //泛型委托
    delegate T NormalEventHandler<T>(T t);
    //delegate T CovarianceEventHandlerError<out T>(T tOut);//Error错误   1   方差无效: 类型参数“T”必须为“Test.CovarianceEventHandlerError<T>.Invoke(T)”上有效的 逆变式。“T”为 协变。
    delegate T CovarianceEventHandler<out T>();
    //delegate T ContravarianceEventHandlerError<in T>(T tIn);//Error错误 1   方差无效: 类型参数“T”必须为“Test.ContravarianceEventHandlerError<T>.Invoke(T)”上有效的 协变式。“T”为 逆变
    delegate void ContravarianceEventHandler<in T>(T tIn);
    delegate T2 ContravarianceEventHandler<in T1,out T2>(T1 tIn);
    //泛型接口
    interface INormal<T> { };
    interface ICovariance<out T> { };
    interface IContravariance<out T> { };

    class ParentClass 
    {
        //基类,父类
        public void Fun()
        {
            MessageBox.Show("ParentClass");
        }
    }

    class ChildClass : ParentClass
    {
        //派生类,子类
        public void Fun()
        {
            MessageBox.Show("ChildClass");
        }
        public void Fun(int i)
        {
            MessageBox.Show("IIII--ChildClass");
        }
    }


    public partial class Form1 : Form
    {
        //协变
        CovarianceEventHandler<ParentClass> CovarianceParent = null;
        CovarianceEventHandler<ChildClass> CovarianceChild = null;
        //逆变
        ContravarianceEventHandler<ParentClass> ContravarianceParent = null;
        ContravarianceEventHandler<ChildClass> ContravarianceChild = null;

        ParentClass ParentFun() 
        {
            ParentClass p = new ParentClass();
            p.Fun();
            return p;
        }

        ChildClass ChildFun()
        {
            ChildClass c = new ChildClass();
            c.Fun(0);
            return c;
        }

        void ParentFun(ParentClass p)
        {
            p.Fun();
        }

        void ChildFun(ChildClass c)
        {
            c.Fun(0);
        }

        public Form1()
        {
            InitializeComponent();
            //协变-父=子
            CovarianceParent = ParentFun;
            CovarianceChild = ChildFun;
            CovarianceParent = CovarianceChild;
            //CovarianceChild = CovarianceParent;//Error,类型无法转换
            ParentClass obj = CovarianceParent();
            ChildClass obj1 = CovarianceChild();
            //ChildClass obj2 = CovarianceParent();//Error,类型无法转换
            if (obj is ChildClass && obj1 is ChildClass) 
            {
                MessageBox.Show("success");
            }
            if (obj is ParentClass && obj1 is ParentClass)
            {
                MessageBox.Show("fail");
            }
            obj.Fun();
            obj1.Fun();
            //obj2.Fun();
            //逆变-子=父
            ContravarianceParent = ParentFun;
            ContravarianceChild = ChildFun;
            ContravarianceChild = ContravarianceParent;
            //ContravarianceParent = ContravarianceChild;//Error,类型无法转换
            ContravarianceChild(new ChildClass());
            ContravarianceParent(new ParentClass());


        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值