草庐IT

c# - 为什么 "dynamic"在用作泛型类型参数时对于所有类型都不是协变和逆变的?

我想知道dynamic在语义上等同于object当用作泛型类型参数时。如果是这样,我很好奇为什么存在这种限制,因为两者在为变量或形式参数赋值时是不同的。我用C#4.0编写了一个小实验来梳理一些细节。我定义了一些简单的接口(interface)和实现:interfaceICovariance{TMethod();}interfaceIContravariance{voidMethod(Targument);}classCovariance:ICovariance{publicTMethod(){returndefault(T);}}classContravariance:IContrav

c# - 为什么 C# (4.0) 不允许通用类类型中的协变和逆变?

该限制的真正原因是什么?这只是必须完成的工作吗?这在概念上很难吗?不可能吗?当然,不能在字段中使用类型参数,因为它们总是可读写的。但这不可能是答案,不是吗?提出这个问题的原因是我正在写一篇关于C#4中的变体支持的文章,我觉得我应该解释一下为什么它仅限于委托(delegate)和接口(interface)。只是为了倒置举证责任。更新:Eric问了一个例子。这个怎么样(还不知道这是否有意义:-))publicclassLookupwhereT:Animal{publicTFind(stringname){Animala=_cache.FindAnimalByName(name);retur

c# - 与 C# 泛型的协变

给定接口(interface)IQuestion和该接口(interface)的实现AMQuestion,假设以下示例:Listtyped=newList();IListnonTyped=typed;正如预期的那样,这个例子产生了一个编译错误,指出两者不是同一类型。但它指出存在显式转换。所以我将其更改为如下所示:Listtyped=newList();IListnonTyped=typedasIList;然后编译,但在运行时,nonTyped始终为null。如果有人可以解释两件事:为什么这不起作用。我怎样才能达到预期的效果。将不胜感激。谢谢! 最佳答案

c#协变返回类型利用泛型

下面的代码是实现协变返回类型的唯一方法吗?publicabstractclassBaseApplication{publicTEmployee{get;set;}}publicclassApplication:BaseApplication{}publicclassNewApplication:BaseApplication{}我希望能够构造一个Application或NewApplication并让它从Employee属性返回适当的Employee类型。varapp=newApplication();varemployee=app.Employee;//thisshouldbeoft

c# - 无效方差 : The type parameter 'T' must be contravariantly valid on 'UserQuery.IItem<T>.ItemList' . 'T' 是协变的

这个问题在这里已经有了答案:Tmustbecontravariantlyvalid(3个答案)关闭3年前。为什么方法可以编译,属性却报错?publicinterfaceIFoo{}publicinterfaceIBarwhereT:IFoo{}publicinterfaceIItemwhereT:IFoo{//IEnumerable>GetList();//worksIEnumerable>ItemList{get;set;}//Error!}错误:Invalidvariance:Thetypeparameter'T'mustbecontravariantlyvalidon'UserQ

c# - .NET 4.0 中的协变和逆变错误

C#4.0协变和逆变支持的一些奇怪行为:usingSystem;classProgram{staticvoidFoo(objectx){}staticvoidMain(){Actionaction=_=>{};//C#3.5supportsstaticco-andcontravariantmethodgroups//conversionstodelegatestypes,sothisisperfectlylegal:action+=Foo;//sinceC#4.0muchbettersupportsco-andcontravariance//forinterfacesanddelega

c# - 为什么 IEnumerable<T> 在 C# 4 中是协变的?

在早期版本的C#中IEnumerable定义如下:publicinterfaceIEnumerable:IEnumerable从C#4开始,定义是:publicinterfaceIEnumerable:IEnumerable是否只是为了让LINQ表达式中烦人的转换消失?这不会引入与string[]相同的问题吗?在C#中(损坏的数组方差)?从兼容性的角度来看,如何添加协方差?较早的代码是否仍适用于较新版本的.NET或此处是否需要重新编译?反过来呢?以前使用此接口(interface)的代码是否在所有情况下都严格不变,或者某些用例现在的行为可能会有所不同? 最佳

c# - 协变和逆变的简单例子

有人可以向我提供简单的C#协变、逆变、不变和反不变(如果存在的话)示例。到目前为止,我看到的所有示例都只是将一些对象转换为System.Object。 最佳答案 CouldsomeoneprovidemesimpleC#examplesofconvariance,contravariance,invarianceandcontra-invariance(ifsuchthingexists).我不知道“反不变性”是什么意思。剩下的就简单了。这是一个协方差的例子:voidFeedTheAnimals(IEnumerableanimals

c# - 通用类型参数协变和多接口(interface)实现

如果我有一个带有协变类型参数的通用接口(interface),就像这样:interfaceIGeneric{stringGetName();}如果我定义这个类层次结构:classBase{}classDerived1:Base{}classDerived2:Base{}然后我可以在单个类上实现接口(interface)两次,就像这样,使用显式接口(interface)实现:classDoubleDown:IGeneric,IGeneric{stringIGeneric.GetName(){return"Derived1";}stringIGeneric.GetName(){return

c# - 仍然对协变和逆变以及输入/输出感到困惑

好的,我在stackoverflow上阅读了一些关于这个主题的内容,观看了this&this,但仍然对协方差/协方差感到困惑。来自hereCovarianceallowsa"bigger"(lessspecific)typetobesubstitutedinanAPIwheretheoriginaltypeisonlyusedinan"output"position(e.g.asareturnvalue).Contravarianceallowsa"smaller"(morespecific)typetobesubstitutedinanAPIwheretheoriginaltypei