泛型中协变和逆变

王朝学院·作者佚名  2016-05-21
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

正文 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 Program10 {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的含义了。

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航