首先这是一个关于泛型的知识,过于冷门,以至于我在书的夹缝中才找到关于它简短的说明。
而且干活这么久确实没用过
可变性分为三种,协变、逆变和不变。
仅将派生类型用作输出值与构造委托有效性之间的常数关系叫做协变。为了让编译器知道我们的期望,必须通过out关键字来进行标记委托声明中的类型参数。
Eg:
Delegate T Factory<out T>();
比如有两个数值,A是基类,B是派生自A。
各自封装成不同的委托类型,这时尽管B派生自A但编译器会报错,因为这两个对象此时为同级的委托对象,这样两者之间实际上并没有派生关系,因此以往的赋值兼容不适用。
我们希望能够返回一个关于A的引用,如果返回指向B也应可以,因为根据兼容性B指向了A,但由于委托类型的不匹配,因此不能这样进行操作。
假如只用作输出值,同样的情况也适用于任何委托。
这样我们传入一个A类型的对象,但实际上传入了B,因为B派生自A,这样调用的代码就能够接受B类型的对象,从而达到可以自由访问B的基类A的部分,最后返回B ,但原本在B的基类A却发生了改变。
逆变
在期望传入基类时允许传入派生对象的特性叫做逆变。
有人看到这,你逆变就写了一行???
其实不是我不想写,而是这俩写出来东西太过于相近,以至于看资料到这我也蒙,我擦,这俩你要这么写有个啥区别?
区别:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。文章来源:https://www.toymoban.com/news/detail-496076.html
所以.....逆变就写了一行...
文章来源地址https://www.toymoban.com/news/detail-496076.html
到了这里,关于c# 协变和逆变的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!