C# - 协变、逆变 看完这篇就懂了
2021-02-06 11:14
标签:创建对象 bar 原理 程序 右键 输入参数 字段 info 打开 官方:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。[MSDN] 公式: 协变:IFoo = IFoo; 逆变:IBar = IBar; 暂时不理解没关系,您接着往下看。 1) out关键字 对于泛型类型参数, 2) 鲁迅:一张图胜过千言万语(图小看不清,单机鼠标右键 -> 在新标签页中打开图片) 备注:泛型委托的斜变原理也是一样的。 3) 什么是协变? 斜变就是对具体成员的输出参数进行一次类型转换,且类型转换的准则是 “里氏替换原则”。 1) in关键字 对于泛型类型参数, 2) 鲁迅:一张图胜过千言万语(图小看不清,单机鼠标右键 -> 在新标签页中打开图片) 3) 什么是逆变? 逆变就是对具体成员的输入参数进行一次类型转换,且类型转换的准则是 “里氏替换原则”。 1)协变、逆变 为什么只能针对泛型接口或者委托?而不能针对泛型类? 因为它们都只能定义方法成员(接口不能定义字段),而方法成员在创建对象的时候是不涉及到对象内存分配的,所以它们是类型(内存)安全的。 为什么不针对泛型?因为泛型类是模板类,而类成员是包含字段的,不同类型的字段是影响对象内存分配的,没有派生关系的类型它们是不兼容的,也是内存不安全的。 2)协变、逆变 为什么是类型安全的? 本质上是里氏替换原则,由里氏替换原则可知:派生程度小的是派生程度大的子集,所以子类替换父类的位置整个程序功能都不会发生改变。 3)官方对 协变、逆变 的定义现在是否能看懂? 上面看懂了,官方定义肯定也是没问题的。派生程度小可以理解为基类,派生程度大可以理解为子类或派生类,至于为什么用程度这个词,是因为继承链的深度是没限制的。 C# - 协变、逆变 看完这篇就懂了 标签:创建对象 bar 原理 程序 右键 输入参数 字段 info 打开 原文地址:https://www.cnblogs.com/VVStudy/p/11404300.html1. 基本概念
2. 协变(Covariance)
out
关键字可指定类型参数是协变的。 可以在泛型接口和委托中使用 out
关键字。[MSDN] 3. 逆变(Contravariance)
in
关键字可指定类型参数是逆变的。 可以在泛型接口和委托中使用 in
关键字。[MSDN]4. 自问自答
文章标题:C# - 协变、逆变 看完这篇就懂了
文章链接:http://soscw.com/index.php/essay/51714.html