首页 > 其他 > 详细

协变和逆变之疑问

时间:2015-08-02 16:23:58      阅读:172      评论:0      收藏:0      [点我收藏+]

前言

关于协变和逆变已经有很多园友谈论过了,学习时也参考过园友们的文章,非常之到位!尤其是园友LoveJenny的,参看时自己也有敲代码加理解,但是出现一个问题,甚是不解,请看下面。【注】这个问题可能对您而言很简单,若有解释,请告知,在此感谢。高手绕道!

既然是标题是协变和逆变,还是先给个公认的msdn概念吧。说完概念直接进入问题区。

概念

协变:是指能够使用与原始指定的派生类型相比,派生程度更大的类型。

逆变:则是指能够使用派生程度更小的类型。

问题

请看代码

1     public class Employee
2     {
3        
4     }
5 
6     public class Programmer : Employee
7     {
8 
9     }

再看定义的接口以及实现

 1     interface ISalary<out T>
 2     {
 3         T pay();
 4         void otherpay(T t);       
 5     }
 6 
 7     public class BaseSalaryCounter<T> : ISalary<T>
 8     {
 9         public T pay()
10         {
11             return default(T);
12         }
13 
14         public void otherpay(T t)
15         {
16             
17         }
18     }

再在控制台中调用

ISalary<Programmer> pro = new BaseSalaryCounter<Programmer>();
            
ISalary<Employee> emp = pro;

毫无疑问出现错误,如下:【注】若不明白错误原因请参考园友LoveJenny文章

技术分享

但是现在我这样做,注意下面红色部分!

 1     interface ISalary<out T>
 2     {
 3         T pay();
 4         void otherpay<T>(T t);       
 5     }
 6 
 7     public class BaseSalaryCounter<T> : ISalary<T>
 8     {
 9         public T pay()
10         {
11             return default(T);
12         }
13 
14         public void otherpay<T>(T t)
15         {
16             
17         }
18     }

再在控制台调用就生成成功了!不是说的out着重于的是返回值,而in着重于的是作为参数吗,这里有个无返回值并且有参数的方法otherpay()方法,根据上面第一个是错误的,修改成这样怎么就对了呢??怎么没出现上图错误呢???才疏学浅,百思不得其解,希望得到令人信服的解释!

 

协变和逆变之疑问

原文:http://www.cnblogs.com/CreateMyself/p/4695725.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!