zoukankan      html  css  js  c++  java
  • 泛型中协变和逆变

         写在前面

            今天讲的内容有点多,但是差不多都能听懂,稍微有点模糊的就是协变和逆变的概念,下面是我结合在网上看的资料整合而成的。

          正文

              msdn上的原话:

              协变:是指能够使用比原始指定的派生类型的派生程度更小(不太确定)的类型

              逆变:是指能够使用比原始类型的派生类型的派生程度更大(更具体)的类型

              在方便理解的概念是:

                协变:子类向父类转化,用于返回类型用out关键字

                逆变:父类向子类转化的过程,用于方法参数类型用in关键字

              协变的例子:

                  

     1   public class Person { }
     2 
     3     public class Student : Person { }
     4 
     5     public delegate T MyDelegate<out T>();
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             MyDelegate<Student> student = () => new Student();
    11             MyDelegate<Person> person = student;
    12 
    13         }
    14     }
    View Code

         如果这里去掉out关键字就会报不能隐式转化的错误

               逆变的例子:

      

     1   public class Person { }
     2 
     3     public class Student : Person { }
     4 
     5     public interface IFly<in T> { }
     6 
     7     public class FlyImp<T> : IFly<T> { }    
     8     public delegate T MyDelegate<T>(T t);
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13 
    14             IFly<Person> peson = new FlyImp<Person>();
    15             IFly<Student> student = peson;
    16         }
    17     }
    View Code

       如果这里IFly<in T>去掉in 后面也要报隐式转换的错误
        哇,好神奇!

        这里终于理解ms提供的2个委托: Action<in> 和Func<out> 里面的in和out的含义了。

           总结

               通过简单的了解后,有了协变和逆变后,以后写代码可以更灵活,当然这是废话,在敲代码的过程中,虽然简单但是还浪费不少时间,也发现自己眼高手低的毛病,以后要多多实践了。

         

  • 相关阅读:
    BZOJ1187 [HNOI2007]神奇游乐园(插头dp)
    BZOJ4926 皮皮妖的递推
    BZOJ3684 大朋友和多叉树(多项式相关计算)
    BZOJ4574 [Zjoi2016]线段树
    杜教筛进阶+洲阁筛讲解+SPOJ divcnt3
    从几场模拟考试看一类分块算法
    bzoj3142 luogu3228 HNOI2013 数列
    luogu3244 bzoj4011 HNOI2015 落忆枫音
    codeforces 286E Ladies' Shop
    BZOJ4825 单旋
  • 原文地址:https://www.cnblogs.com/JaggerMan/p/4187582.html
Copyright © 2011-2022 走看看