• 泛型中协变和逆变


         写在前面

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

          正文

              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的含义了。

           总结

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

         

  • 相关阅读:
    【字符串题目】poj 3096 Surprising Strings
    【转载】:【博弈论】博弈的学习和总结
    【博弈论】hihocoder
    转载:SPFA算法学习
    马克思所言:
    【NOIP2013】火柴排队
    【NOIP2013】【P1441】花匠
    【JZOI2002】【BZOJ1477】【P1371】青蛙的约会
    【P1373】奶牛的卧室
    2016.9.16 の 測試
  • 原文地址:https://www.cnblogs.com/JaggerMan/p/4187582.html
Copyright © 2020-2023  润新知