我有一个书,它解释反方差/协方差如下:
这就是一个例子。
using System;
delegate void StringAction(string s);
delegate object ObjectRetriever();
class Test
{
static void Main()
{
StringAction sa = new StringAction(ActionObject);
sa("hello");
ObjectRetriever o = new ObjectRetriever(RetrieveString);
object result = o();
Console.WriteLine(result);
}
static string RetrieveString() {return "hello";}
static void ActionObject(object o)
{
Console.WriteLine(o);
}
}我认为为了使用协方差/反向方差,需要使用new,如本例所示,但我似乎在sa = ActionObject和o = RetrieveString中得到了相同的结果。(我用Mono测试)。
new来解释协方差/反方差呢?object x = Everything inherit from object的花哨名字吗?这个奇怪的名字是从哪里来的?它的用途是什么?发布于 2011-07-23 05:32:36
我有一本书解释反方差/协方差如下..。
这并不是一个很好的解释差异。我们完全不清楚什么叫做“协方差”和“反方差”。
实际上是变体的东西从来没有提到过。相反,是从类型映射到具有该类型参数的委托。反方差是映射和关系的性质。
试着阅读这篇文章,看看你是否能更好地理解它:
http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx
我认为为了使用协方差/反方差,需要使用新的,如示例所示,但我似乎得到了相同的结果.
自从C# 2.0以来,您可以说"d = M“或"d = new (M)”--编译器只是将它们识别为两种不同的方式来编写相同的东西。
为什么作者用新的解释协方差/反方差?
我不知道。
协方差/反方差思想背后的理论是什么?
理论是,如果你有一个排序关系--也就是说,X比Y大,如果X= (Y)y是合法的--你有一个映射来保持排序关系,那么映射是协变的。如果它逆转了排序关系,那么它就是反变体。
例如,假设动物比长颈鹿大。所以你可以把一个长颈鹿类型的对象分配给一个动物类型的变量。动物>长颈鹿。
现在,进行从类型T到方法M-that-a-T和委托类型D-T.a的映射。
你可以指定一个方法M-那个带一个动物到一个变量的D-那个带着一个长颈鹿.D(长颈鹿)>M(动物)但动物>长颈鹿。这种关系是相反的;映射是相反的。
它仅仅是描述对象x=所有从对象继承的东西的花哨名称吗?
不是的。它与这个概念相关,因为对象是一个比几乎所有其他类型都大的类型。但实际上是不同的映射,它保留或逆转了一个大小关系。
试着读一下这个,看看它是否有用。
http://blogs.msdn.com/b/ericlippert/archive/2009/11/30/what-s-the-difference-between-covariance-and-assignment-compatibility.aspx
这个奇怪的名字是从哪里来的?
范畴理论
发布于 2011-07-23 02:03:16
我所见过的描述C#中协方差/反向方差的最好信息是Eric 这里的一系列博客文章。从列表的底部看,十一部分系列。
有时读起来有点难。但它解释了一开始你能要求的一切。:)
它是在实际的C# 4.0实现之前编写的,所以对语法的一些讨论已经过时,但是其他的一切似乎都是按照描述实现的。
发布于 2011-07-23 02:13:10
下面是一篇很棒的wiki文章:这里
更重要的是,漏斗向哪个方向倾泻,并将漏斗的宽度设置在适当的水平上。
https://stackoverflow.com/questions/6797759
复制相似问题