码迷,mamicode.com
首页 > 其他好文 > 详细

协变和逆变之疑问

时间:2015-08-02 16:25:51      阅读:104      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!