C# : Is Variance (Covariance/Contravariance) another word for Polymorphism?

标签 c# polymorphism covariance contravariance variance

我试图从网上的几篇文章和 StackOverflow 上的问题中找出 CovarianceContravariance 这两个词的确切含义,据我所知,这只是多态性的另一种说法

我上面的说法正确吗?还是我听错了?

最佳答案

肯定和多态有关。不过,我不会说它们只是多态性的“另一个词”——它们是关于非常具体的情况,在这种情况下,您可以将一种类型视为另一种类型在特定上下文中

例如,使用正常的多态性,您可以处理对 Banana 的任何引用作为对 Fruit 的引用- 但这并不意味着您可以替代 Fruit 每次 当您看到 Banana 类型时.例如,List<Banana>不能被视为 List<Fruit>因为list.Add(new Apple())适用于 List<Fruit>但不适用于 List<Banana> .

协变允许在 API 中替换“更大”(不太具体)的类型,其中原始类型用于“输出”位置(例如作为返回值)。逆变允许在 API 中替换“更小”(更具体)的类型,其中原始类型用于“输入”位置。

很难在单个 SO 帖子中详细介绍所有细节(尽管希望其他人能做得比这更好!)。埃里克·利珀特 (Eric Lippert) 拥有出色的 series of blog posts关于它。

关于C# : Is Variance (Covariance/Contravariance) another word for Polymorphism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078423/

相关文章:

c# - 如何检查对象是否可为空?

c++ - 通过 QT 的信号/槽系统传递通用异常作为参数

python - sqlalchemy中查询多态关系

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

c# - 使用更指定的返回类型(协方差)覆盖抽象属性

c# - Javascript中获取满足特定条件的数组内的数组

c# - 使用 LINQ 从文件中高效地计算总计

c# - 任何忽略 csproj 文件中 nuget 包的所有警告的方法

c# - 为什么不能将 List<Derived> 分配给 List<Base>?

java - Scala,不喜欢 java 集合 API?