泛型中协变和逆变_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 泛型中协变和逆变

泛型中协变和逆变

 2014/12/26 23:21:21  冷凌弃  程序员俱乐部  我要评论(0)
  • 摘要:写在前面今天讲的内容有点多,但是差不多都能听懂,稍微有点模糊的就是协变和逆变的概念,下面是我结合在网上看的资料整合而成的。正文msdn上的原话:协变:是指能够使用比原始指定的派生类型的派生程度更小(不太确定)的类型逆变:是指能够使用比原始类型的派生类型的派生程度更大(更具体)的类型在方便理解的概念是:协变:子类向父类转化,用于返回类型用out关键字逆变:父类向子类转化的过程,用于方法参数类型用in关键字协变的例子:1publicclassPerson{}23publicclassStudent
  • 标签:泛型

     写在前面

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

      正文

          msdn上的原话:

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

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

          在方便理解的概念是:

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

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

          协变的例子

              

class="code_img_closed" src="/Upload/Images/2014122623/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('eb9d26f4-7f2d-4905-b715-2cd0cc9b97ba',event)" src="/Upload/Images/2014122623/2B1B950FA3DF188F.gif" alt="" />
 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的含义了。

       总结

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

 

     

发表评论
用户名: 匿名