草庐IT

covariance

全部标签

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

我试图从网上的几篇文章和StackOverflow上的问题中找出Covariance和Contravariance这两个词的确切含义,据我所知,这只是多态性的另一种说法。我上面的说法正确吗?还是我听错了? 最佳答案 肯定和多态有关。不过,我不会说它们只是多态性的“另一个词”——它们是关于非常具体的情况,在这种情况下,您可以将一种类型视为另一种类型在特定上下文中。例如,使用正常的多态性,您可以处理对Banana的任何引用作为对Fruit的引用-但这并不意味着您可以替代Fruit每次当您看到Banana类型时.例如,List不能被视为L

c# - 协方差和向上转型之间的区别

协方差和向上转型之间有什么区别,或者更具体地说,为什么它们有不同的名称?我见过以下称为“向上转换”的示例:strings="hello";objecto=s;//upcastto'string'to'object'然而,我看到以下称为“协方差”:string[]s=newstring[100];object[]o=s;IEnumerableies=newList();IEnumerableieo=ies;现在,在我未经训练的眼中,协方差似乎与向上转换相同,只是它指的是集合的转换。(关于逆变和向下转型,可以做出类似的陈述)。真的有那么简单吗? 最佳答案

c# - 协方差和向上转型之间的区别

协方差和向上转型之间有什么区别,或者更具体地说,为什么它们有不同的名称?我见过以下称为“向上转换”的示例:strings="hello";objecto=s;//upcastto'string'to'object'然而,我看到以下称为“协方差”:string[]s=newstring[100];object[]o=s;IEnumerableies=newList();IEnumerableieo=ies;现在,在我未经训练的眼中,协方差似乎与向上转换相同,只是它指的是集合的转换。(关于逆变和向下转型,可以做出类似的陈述)。真的有那么简单吗? 最佳答案

c# - C# 4.0 中如何实现泛型协变和逆变?

我没有参加PDC2008,但听说C#4.0宣布支持泛型协变和逆变。即List可以分配给List.怎么可能?在JonSkeet的书C#inDepth中,解释了为什么C#泛型不支持协变和逆变。它主要用于编写安全代码。现在,C#4.0更改为支持它们。会不会带来困惑?谁知道C#4.0的细节可以给些解释? 最佳答案 Variance只会以安全的方式得到支持——事实上,使用CLR已有的能力。所以我在尝试使用List的书中给出的示例作为List(或不管它是什么)仍然不起作用-但其他一些情况会起作用。首先,它只支持接口(interface)和委托(

c# - C# 4.0 中如何实现泛型协变和逆变?

我没有参加PDC2008,但听说C#4.0宣布支持泛型协变和逆变。即List可以分配给List.怎么可能?在JonSkeet的书C#inDepth中,解释了为什么C#泛型不支持协变和逆变。它主要用于编写安全代码。现在,C#4.0更改为支持它们。会不会带来困惑?谁知道C#4.0的细节可以给些解释? 最佳答案 Variance只会以安全的方式得到支持——事实上,使用CLR已有的能力。所以我在尝试使用List的书中给出的示例作为List(或不管它是什么)仍然不起作用-但其他一些情况会起作用。首先,它只支持接口(interface)和委托(

c# - 从 x 到 y 的协变数组转换可能会导致运行时异常

我有一个privatereadonlyLinkLabel列表小号(IList)。我稍后添加LinkLabels添加到此列表并将这些标签添加到FlowLayoutPanel如下所示:foreach(varsinstrings){_list.Add(newLinkLabel{Text=s});}flPanel.Controls.AddRange(_list.ToArray());Resharper向我显示警告:Co-variantarrayconversionfromLinkLabel[]toControl[]cancauserun-timeexceptiononwriteoperatio

c# - 从 x 到 y 的协变数组转换可能会导致运行时异常

我有一个privatereadonlyLinkLabel列表小号(IList)。我稍后添加LinkLabels添加到此列表并将这些标签添加到FlowLayoutPanel如下所示:foreach(varsinstrings){_list.Add(newLinkLabel{Text=s});}flPanel.Controls.AddRange(_list.ToArray());Resharper向我显示警告:Co-variantarrayconversionfromLinkLabel[]toControl[]cancauserun-timeexceptiononwriteoperatio

c# - 为什么协变和逆变不支持值类型

IEnumerable是co-variant但它不支持值类型,只支持引用类型。下面的简单代码编译成功:IEnumerablestrList=newList();IEnumerableobjList=strList;但从string改变至int会得到编译错误:IEnumerableintList=newList();IEnumerableobjList=intList;原因在MSDN中解释:Varianceappliesonlytoreferencetypes;ifyouspecifyavaluetypeforavarianttypeparameter,thattypeparameter

c# - 为什么协变和逆变不支持值类型

IEnumerable是co-variant但它不支持值类型,只支持引用类型。下面的简单代码编译成功:IEnumerablestrList=newList();IEnumerableobjList=strList;但从string改变至int会得到编译错误:IEnumerableintList=newList();IEnumerableobjList=intList;原因在MSDN中解释:Varianceappliesonlytoreferencetypes;ifyouspecifyavaluetypeforavarianttypeparameter,thattypeparameter

generics - 在 Go 中实现通用映射器的惯用方法

这个问题在这里已经有了答案:Shortwaytoapplyafunctiontoallelementsinalistingolang(5个答案)关闭5个月前。假设我想编写一个函数来检查谓词是否与slice中的元素匹配:funcIsIn(array[]T,predfunc(eltT)bool)bool{for_,obj:=rangearray{ifpred(obj){returntrue;}}returnfalse;}显然,前面的代码无法编译,因为T不存在。我可以将其替换为一些interface{},如下所示:funcIsIn(array[]interface{},predfunc(el