栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

C# 关于泛型之协变逆变

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C# 关于泛型之协变逆变

C# 关于泛型之协变逆变
协变+逆变是一种高级约束====为了规避异常情况

为什么要有协变和逆变

class Program
    {
        static void Main(string[] args)
        {

            #region 协变与逆变,泛型的缺陷

            {
                Bird bird1 = new Bird();
                Bird bird2 = new Sparrow();
                Sparrow sparrow1 = new Sparrow();
                //Sparrow sparrow2 = new Bird();

                List birdlist1 = new List();//一堆鸟就是一堆鸟
                List birdlist2 = new List(); //报错:一堆麻雀是一堆鸟不成立(1.泛型的缺陷)
                                                            //为什么报错:
                                                            //1.List 是个类
                                                            //2.List 也是一个类
                                                            //3.这两者没有父子关系---从C#语法上来讲,不能这样写
                List birdlist3 = new List().Select(c => (Bird)c).ToList();
            }

            //接口间的协变与逆变,委托之间的协变与逆变,out in 关键字


            //协变---可以让左边使用父类,类型参数使用 out来修饰----类型参数只能做返回值,不能做参数
            {
                IEnumerable birdlist1 = new List();
                IEnumerable birdlist2 = new List();
                //List 继承自 IEnumerable,List与IEnumerable是父子类关系

                Func func = new Func(() => { return null; });

                ICustomerListOut customerList1 = new CustomerListOut();
                ICustomerListOut customerList2 = new CustomerListOut();
            }

            //逆变--in--可以让左边使用子类:类型参数使用in修饰;----类型参数只能作参数,不能用作返回值:
            {
                ICustomerListIn customerList2 = new CustomerListIn();
                ICustomerListIn customerList1 = new CustomerListIn();

                ICustomerListIn birdList1 = new CustomerListIn();
                birdList1.Show(new Sparrow());
                birdList1.Show(new Bird());
                Action act = new Action((Bird i)=> { });

            }

            #endregion

        }
    }


    /// 
    /// 鸟
    /// 
    public class Bird
    {
        public int ID { get; set; }
    }

    /// 
    /// 麻雀
    /// 
    public class Sparrow : Bird
    {
        public string Name { get; set; }
    }

    public interface ICustomerListOut
    {
        T Get();
        //void Show(T t);
    }

    public class CustomerListOut : ICustomerListOut
    {
        public T Get()
        {
            return default(T);
        }

        //public void Show(T t)
        //{
            
        //}

    }


    public interface ICustomerListIn
    {
        //T Get();
        void Show(T t);
    }

    public class CustomerListIn : ICustomerListIn
    {
        //public T Get()
        //{
        //    return default(T);
        //}

        public void Show(T t)
        {

        }
    }

内容来源:
https://www.bilibili.com/video/BV1YR4y1L7YE?p=15&spm_id_from=pageDriver&vd_source=98f5b1d1aaf39c81d51a356b2da2f703

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976011.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号