派生类型的公共基类我有以下代码。classHeader其中T:IItem{}classHeaderA:Header{}classHeaderB:Header{}interfaceIItem{}classItemA:IItem{}classItemB:IItem{}Headerh=newHeaderA();最后一行不编译。无法将类型“UserQuery.HeaderA”隐式转换为“UserQuery.Header”HeaderA是Header的子类型,ItemA是IItem的子类型。为什么它不起作用?简而言之,您正在尝试使用一个称为协方差的概念,它在.NET泛型类中不受支持,并且默认情况下在接口中也不支持。如果要允许类执行此操作,可以在C#3或更高版本中使用通用接口上的out上下文关键字指定它:interfaceIHeaderwhereT:IItem{}classHeader:IHeaderwhereT:IItem{}classHeaderA:Header{}classHeaderB:Header{}interfaceIItem{}classItemA:IItem{}classItemB:IItem{}publicvoidFoo(){//现在可以了;注意使用接口而不是基类。IHeaderh=newHeaderA();通过使用带有关键字的接口,您基本上是在告诉编译器接口的使用不必知道泛型类型,而不是它满足接口的泛型类型声明(或者它是一个对象)约束。因此,虽然您现在可以将更多派生泛型分配给接口类型的变量,但您只能将它们视为接口类型,而不是任何派生类型。对于类定义,不接受out关键字;您不能强制标头的使用是协变的。以上就是C#学习教程:派生类型的泛型基类分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
