考虑这个什么都不做的愚蠢程序:interfaceI{}classA1:I{}classA2:A1,I{}classB1{}classB2:B1,I{}classC1:I{}classC2:C1,I{}staticclassProgram{staticvoidf(Iobj){}staticvoidMain(){f(newA2());f(newA2());f(newB2());f(newB2());f(newC2());f(newC2());}}这表明A2和C2同时实现I和I,那B2同时实现I和I.但是,将其修改为staticvoidMain(){f(newA2());f(newB2())
C#规范指出参数类型不能同时是协变和逆变的。这在创建协变或逆变接口(interface)时很明显,您分别用“out”或“in”修饰类型参数。没有同时允许两者的选项(“outin”)。这种限制仅仅是一种特定于语言的约束,还是基于范畴论的更深层、更根本的原因会让您不希望您的类型既是协变又是逆变的?编辑:我的理解是数组实际上是协变和逆变的。publicclassPet{}publicclassCat:Pet{}publicclassSiamese:Cat{}Cat[]cats=newCat[10];Pet[]pets=newPet[10];Siamese[]siameseCats=newSi
这是CLR的限制还是与现有代码存在兼容性问题?这是否与C#4.0中委托(delegate)组合的困惑变化有关?编辑:是否有可能在CLR上运行没有这种限制的使用协变/逆变的语言? 最佳答案 您会想阅读埃里克·利珀特(EricLippert)的博文,了解它为何如此运作。简而言之,他们允许尽可能多的变化,不允许开发人员在编程中犯下可能导致难以追踪错误的严重错误。4.0中的差异量比3.0规则大大扩展,据我所知,这是对开发人员有益的内容与允许安全的内容之间的平衡,不会因无意的错误引起太多麻烦。http://blogs.msdn.com/b/e
我非常喜欢使用C#5.0异步编程。然而,有几个地方更新旧代码以与TAP模型保持一致给我带来了问题。这是其中之一-我不确定为什么Task在TResult中不是协变的,但在尝试更新协变接口(interface)以从同步模式移动到异步模式时,它给我带来了问题:旧代码:publicinterfaceIInitializable//**outgenericmodifier**{//////Booleantoindicateifclassisready///boolIsInitialized{get;}//////Callsforinstancetobeinitializedusingcurren
(我会自己检查一下,但我还没有VS2010(还))假设我有2个基本接口(interface):IBaseModelInterfaceIBaseViewInterface还有2个实现这些的接口(interface):ISubModelInterface:IBaseModelInterfaceISubViewInterface:IBaseViewInterface如果我定义一个Tuple我想根据返回Tuple的工厂的结果来设置它.在C#3中,即使子接口(interface)实现了基接口(interface),我也不能这样做。如果我使用IEnumerable,我很确定C#4允许我这样做因为它
我不清楚为什么以下代码片段不是协变的?publicinterfaceIResourceColl:IEnumerablewhereT:IResource{intCount{get;}Tthis[intindex]{get;}boolTryGetValue(stringSUID,outTobj);//Errorhere?}Error1Invalidvariance:Thetypeparameter'T'mustbeinvariantlyvalidon'IResourceColl.TryGetValue(string,outT)'.'T'iscovariant.我的界面只在输出位置使用模板参
定义了这个接口(interface):publicinterfaceIInputBoxService{boolShowDialog();TResult{get;}}为什么下面的代码有效:publicclassStringInputBoxService:IInputBoxService{...}...IInputBoxServiceservice=newStringInputBoxService();这不是吗?publicclassIntegerInputBoxService:IInputBoxService{...}...IInputBoxServiceservice=newInteg
更新:以下代码仅在C#4.0(VisualStudio2010)中有意义看来我对协变/逆变有一些误解。谁能告诉我为什么以下代码无法编译?publicclassTestOne{publicIEnumerableMethod(IEnumerablevalues)whereTDerived:TBase{returnvalues;}}编译时:(!!!)publicinterfaceIBase{}publicinterfaceIDerived:IBase{}publicclassTestTwo{publicIEnumerableMethod(IEnumerablevalues){returnva
考虑以下示例:classBase{}classDerived:Base{}classTest1{privateListm_X;publicIEnumerableGetEnumerable(){returnm_X;}}这编译得很好,因为IEnumerable在T中协变.但是,如果我做完全相同的事情,但现在使用泛型:classTest2whereTDerived:TBase{privateListm_X;publicIEnumerableGetEnumerable(){returnm_X;}}编译错误Cannotconvertexpressiontype'System.Collection
我为我们的项目添加了一个协变接口(interface):interfaceIView{}interfaceIPresenterwhereTView:IView{TViewView{get;}}我创建了一些类,实现了这些接口(interface):classTestView:IView{}classTestPresenter:IPresenter{publicTestViewView{get{returnsomething;}}privatevoidDoSomething(){}}我可以毫无问题地使用它:IPresenterpresenter=newTestPresenter();所以一