【问题标题】:Does normal object base type - derived type conversion come under Covariance and contravariance?普通对象基类型 - 派生类型转换是否属于协变和逆变?
【发布时间】:2014-08-01 06:20:56
【问题描述】:

协变和逆变为数组、委托和通用参数类型提供隐式引用转换。

IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;

Action<object> actObject = SetObject;
Action<string> actString = actObject;

普通对象基类型派生类型转换是否属于协变和逆变,如下所述?

ChildClass childobj=new ChildClass;
BaseClass baseobj=childobj;

BaseClass baseobj=new BaseClass;
ChildClass childobj= (BaseClass) baseobj;

如果是,运行时如何处理它,如果不是,为什么?

【问题讨论】:

  • 例3和例4不是协变和逆变的。它们只是参考转换。示例 4 无法编译。

标签: c# .net covariance contravariance


【解决方案1】:

协方差和逆变仅适用于参数多态,例如。当一种类型有另一种类型作为参数时。那是因为某些用例可能会编译,即使它们没有正确输入。例如like this

您的第二个示例只是简单的数据多态性,不需要应用协变和逆变,因为这些用例不适用。

【讨论】:

  • 感谢您的快速响应。在元素类型为引用类型的 C# 数组中是协变的。例如:Animal[] animals=new Mammal[10];对于数组,它不适用于参数多态性并且也保存数据。那么它是如何归于协方差和逆变的呢?
  • @AnoobAliyar 您还需要将其视为参数多态性。假设Animal[]Array&lt;Animal&gt;,那么一切都清楚了。
  • @AnoobAliyar 正是斯里拉姆所说的。语法不同并不意味着类型不同。
  • 您是说数组将像 Array 一样在内部表示吗?如果您有任何数据多态性,请提出一些有用的链接。
猜你喜欢
  • 2013-11-29
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 2017-03-19
相关资源
最近更新 更多