c#中关于协变性和逆变性(又叫抗变)帮助理解
2024-09-27 12:51:41
今天回忆了之前看的《深入理解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)
总结:协变和逆变就是在泛型接口类型将类型参数作为输入和输出的情况下,对类型间进行隐式转换的规律。
最新文章
- 用MSF进行提权
- python 学习笔记十七 django深入学习二 form,models
- error MSB6006: &ldquo;cmd.exe&rdquo;已退出,代码为 3。
- P4实验问题 解决python模块导入
- 使用RazorEngine对ASP.NET MVC的Views进行UnitTest
- POJ1699 Best Sequence(AC自动机+状压DP)
- 5.POST中文乱码解决方案
- adb调试命令详解-2016.02.01
- ubuntu安装体验
- git 客户端提交
- SpringBoot Test集成测试
- Fiddler中使用AutoResponder创建规则替换线上文件
- Linux常见命令(系统命令)
- 关于Ajax的认识和封装(小记)
- ES6函数的特性(箭头语法)
- 人生第一次成功的sql注入
- 使用Flask+uwsgi+Nginx部署Flask正式环境
- cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip
- HighCharts定时刷新图表
- Linux High Availabi RHCS