协方差/逆变是否适用于不实现公共接口的隐式可转换类型?

本文关键字:接口 类型 可转换 实现 方差 是否 适用于 | 更新日期: 2023-09-27 18:02:26

我正在学习c#中的协方差和逆变。

所有示例都有对象可转换的细节,并且由于与接口实现的准确性而有所不同,例如

其中Circle : IShape

协方差:SomeType<Circle> as SomeType<IShape>
逆变:SomeType<IShape> as SomeType<Circle>

如果TypeATypeB都有一个implicit converter来转换为另一种类型,但是不实现任何公共接口,在处理这些类型的泛型转换时,谈论协方差/逆变是否仍然正确?或者这是一个不同的概念?

协方差/逆变是否适用于不实现公共接口的隐式可转换类型?

不同的概念。out意义上的协方差(或in意义上的逆变方差)总是保持引用的,根本没有变换——只是其他(可证明的)项中的相同引用。这也是为什么它不适用于实现接口的结构,因为框不是引用保存的。同样的保引用逻辑也适用于引用类型数组的协变赋值。

这些类型不需要实现一个公共接口来实现共变/反变。

这些术语只是指转换是否会导致信息的丢失或信息的潜在增加。

所以,是的,当谈论没有公共接口的对象时,只要有隐式转换器,谈论co/contro -variance仍然是正确的。