“协方差”和“反方差”概念的含义是什么?
给定两个类,和 Elephant (继承自),我的理解是,如果尝试将大象放入一个动物数组中,您将得到一个运行时错误,这是因为大象比动物“更大”(更具体)。但是你能把一只动物放到大象的数组中,看看大象是如何保证包含动物属性的吗?
发布于 2008-11-07 15:31:34
你倒过来了。您可以向动物数组中添加大象,因为它是一个动物,并且保证它拥有动物所需要的所有方法。不能将动物添加到大象数组中,因为它确实具有,而不是,它拥有大象所需的所有方法。
维基百科关于协方差与反方差的文章对此有很好的解释:
在编程语言的类型系统中,如果一个从类型到类型的操作符保留类型的排序(≤),则它是协变的,它将类型从更具体的类型排序到更一般的类型;如果它逆转了这种顺序,则是相反的。如果这两种方法都不适用,则运算符是不变的。这些术语来自范畴理论。
另外,你说大象“更大”,但事实并非如此。类型动物是“更大”的意义上,它包括更具体的类型,如大象,长颈鹿,和狮子。
发布于 2008-11-07 15:31:28
请看一下C# 4.0中协方差和反向方差的概述,看看这是否有帮助:
http://blogs.msdn.com/charlie/archive/2008/10/27/linq-farm-covariance-and-contravariance-in-visual-studio-2010.aspx
发布于 2012-10-17 00:43:22
您应该尝试阅读用Visual 2010介绍.NET 4.0的45-49页,其中涉及到了这个精确的示例。它甚至有一些大象的好照片。
主要的目的是,做这个。
var things = new List<IThing<IContent>> { new ConcreteThing() }通过以下方式:
public class ConcreteThing : IThing<ConcreteContent>
{
}您需要接口定义中的" out“,这将允许设置更具体的表单,但是必须保证从IThing中读取的任何内容都是更通用的类型。
public interface IThing<out T> where T : IContent
{
}https://stackoverflow.com/questions/272428
复制相似问题