• C#笔记 -- 协变、逆变


    协变

    理解:在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用由A派生的泛型参数B的类型实例化,(小=> 大)如

    // IEnumerable<Animal> 与 List<Dog> 之间无继承关系,但是不会报错,协变
    // IEnumerable<out T>
    IEnumerable<Animal> animals = new List<Dog>(); 
    
    // 下行会报错 => List<Dog>  不继承 List<Animal> 类型, 无法类型转化
    // List<T>
    List<Animal> animals = new List<Dog>();
    

    条件: 使用 泛型修饰符 out, 并且只能用作返回类型,该泛型参数不能用作方法参数使用

    逆变

    理解: 在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用A父类级别的泛型参数B的类型实例化,(大=>小)如

    // Action<Dog> 与 Action<Animal> 无继承关系,不报错无,逆变
    // Action<in T>
    Action<Dog> actionDog = new Action<Animal>(a => { Console.WriteLine("animal"); });
    
    // 下行报错 => Func<Dog> 与 Func<Animal> 无继承关系,报错
    // Func<Out TResult>
    Func<Dog> actionDog1 = new Func<Animal>(() => new Dog());
    

    条件:使用 泛型修饰符 in, 并且只能被使用,或者作为方法参数,不能用作返回类型

    总结

    返回结果的协变性

    使用类型的逆变性

    参考资料

    那些年搞不懂的"协变"和"逆变"

  • 相关阅读:
    【Python第九篇】异步IO数据库队列缓存
    【Python第八篇】线程、进程及协程
    【Python第七篇】Socket网络编程
    实验五全部代码,ajax请求
    添加员工
    联级选择
    查询,利用jquery选择器
    列表、表格单选框
    注册
    聊天框
  • 原文地址:https://www.cnblogs.com/clockwork/p/6515521.html
Copyright © 2020-2023  润新知