今天回忆了之前看的《深入理解C#》这本书中的泛型章节,其中对泛型的可变性的理解。泛型可变性分两种:协变和逆变。逆变也又称为抗变。

 怎么理解这两个名词的意思:

  ①:协变即为在泛型接口类型中使用out标识的类型参数。协变的字面意思是“与变化的方向相同”②逆变那就是用in来标识的泛型接口类型的类型参数。逆变的字面意思是“与变化的方向相反”

  需要注意的是无论是协变还是逆变也只能在泛型接口中来使用。

  先来举个基本的例子,来加强你对可变性的理解。在C#中有隐式类型转换,比如:

  string str = "nibian";
object str1 = str;
Console.WriteLine(str1);

  

  大家都知道string类型是object类型的子类型,即string->object为子->父;从子类型到父类型的转换是隐式类型转换。

举个例子:

 interface IDemo<out T>
{
T Method(string str);
}
class One : IDemo<string>
{
public string Method(string str)
{
return str;
}
}
class Two : IDemo<object>
{
public object Method(string str)
{
return str;
}
}
class Program
{
static void Main(string[] args)
{
IDemo<string> one = new One();
IDemo<object> two;
two = one;
Console.WriteLine(two.Method("2222"));
}
}

  

因为string是object类型的子类,在这里IDemo<string>和IDemo<object>类型之间也存在着类型转换的,从IDemo<string>向IDemo<object>进行的转换可以看成是子类型向父类型的隐式转换,它的这个用法就是协变。(这里必须要用out)

相反的我们在来看一下有关逆变的代码:

 interface IDemo<in T>
{
string Method(T str);
}
class One : IDemo<string>
{
public string Method(string str)
{
return str;
}
}
class Two : IDemo<object>
{
public string Method(object str)
{
return str.ToString();
}
}
class Program
{
static void Main(string[] args)
{
IDemo<object> two = new Two();
IDemo<string> one;
one = two;
Console.WriteLine(one.Method("2222"));
}
}

  同样的从IDemo<object>类型向IDemo<string>类型的转换,但是在这里我们却将父类型隐式转换为子类型的用法叫逆变。(这里必须要用in)

总结:协变和逆变就是在泛型接口类型将类型参数作为输入和输出的情况下,对类型间进行隐式转换的规律。

最新文章

  1. 用MSF进行提权
  2. python 学习笔记十七 django深入学习二 form,models
  3. error MSB6006: &ldquo;cmd.exe&rdquo;已退出,代码为 3。
  4. P4实验问题 解决python模块导入
  5. 使用RazorEngine对ASP.NET MVC的Views进行UnitTest
  6. POJ1699 Best Sequence(AC自动机+状压DP)
  7. 5.POST中文乱码解决方案
  8. adb调试命令详解-2016.02.01
  9. ubuntu安装体验
  10. git 客户端提交
  11. SpringBoot Test集成测试
  12. Fiddler中使用AutoResponder创建规则替换线上文件
  13. Linux常见命令(系统命令)
  14. 关于Ajax的认识和封装(小记)
  15. ES6函数的特性(箭头语法)
  16. 人生第一次成功的sql注入
  17. 使用Flask+uwsgi+Nginx部署Flask正式环境
  18. cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip
  19. HighCharts定时刷新图表
  20. Linux High Availabi RHCS

热门文章

  1. 【转】内存耗用:VSS/RSS/PSS/USS
  2. 运维自动化工具 Kickstart
  3. 关于js闭包的一些浅层面的理解
  4. Spark之 RDD转换成DataFrame的Scala实现
  5. NPC问题及其解决方法(回溯法、动态规划、贪心法、深度优先遍历)
  6. Appium+python自动化-Remote远程控制
  7. 解决T4模板的程序集引用的五种方案
  8. loadrunner中回放log看不到参数替代后具体数值
  9. scrapy定制爬虫-爬取javascript——乾颐堂
  10. 使用第三方库连接MySql数据库:PyMysql库和Pandas库