草庐IT

Contravariance

全部标签

c# - T 必须逆变有效

这是怎么回事?interfaceIRepositorywhereT:IBusinessEntity{IQueryableGetAll();voidSave(Tt);voidDelete(Tt);}它说:Invalidvariance:Thetypeparameter'T'mustbecontravariantlyvalidon'MyNamespace.IRepository.Delete(T)'.'T'iscovariant. 最佳答案 考虑如果编译器允许会发生什么:interfaceIR{voidD(Tt);}classC:IR{

类型参数的 C# 方差注释,限制为值类型

在C#中可以为类型参数添加方差注释,限制为值类型:interfaceIFoowhereT:struct{voidBoo(Tx);}如果方差注释在这种情况下完全没有意义,为什么编译器允许这样做? 最佳答案 Whythisisallowedbycompilersincevarianceannotationmakecompletelynosenseinasuchsituation?这是编译器允许的,因为当我向C#4.0编译器添加差异规则时,我什至从未考虑过有人可能会尝试这样做。编译器警告和错误是特性,为了实现某个特性,至少必须在发布编译器

类型参数的 C# 方差注释,限制为值类型

在C#中可以为类型参数添加方差注释,限制为值类型:interfaceIFoowhereT:struct{voidBoo(Tx);}如果方差注释在这种情况下完全没有意义,为什么编译器允许这样做? 最佳答案 Whythisisallowedbycompilersincevarianceannotationmakecompletelynosenseinasuchsituation?这是编译器允许的,因为当我向C#4.0编译器添加差异规则时,我什至从未考虑过有人可能会尝试这样做。编译器警告和错误是特性,为了实现某个特性,至少必须在发布编译器

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

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

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

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

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# - 为什么协变和逆变不支持值类型

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

java - 在像 Stream.reduce() 这样的 API 中选择不变性的充分理由是什么?

审查Java8StreamAPI设计,我对Stream.reduce()上的通用不变性感到惊讶论据:Ureduce(Uidentity,BiFunctionaccumulator,BinaryOperatorcombiner)同一个API的一个看似更通用的版本可能对U的各个引用应用了协变/逆变。,如:Ureduce(Uidentity,BiFunctionaccumulator,BiFunctioncombiner)这将允许以下情况,目前这是不可能的://Assumingwewanttoreusethesetoolsallovertheplace:BiFunctionnumberAdd