这个演员怎么就不行了?interfaceIFolderOrItemwhereTFolderOrItem:FolderOrItem{}abstractclassFolderOrItem{}classFolder:FolderOrItem{}abstractclassItem:FolderOrItem{}classDocument:Item{}现在我想这样做:classSomething{IFolderItemOrvoItemgetSelected}set;{SomeMagicMethod(){this.SelectedItem=(IFolderOrItem)GetMagicDocument();//坏坏坏...??}IFolderOrItemGetMagicDocument(){返回someMagicDocument;//哪个是IFolderOrItem类型}}是否可以让它工作?如果我没看错……那么问题出在Foo:Bar上,这并不意味着ISomething:ISomething..在某些情况下,C#4.0中的差异可能是一个选项。或者,有时您可以使用通用方法来做某事(尽管不确定它在这方面是否有帮助)。在C#3.0(及更低版本)中最接近的可能是非泛型基接口:interfaceIFolderOrItem{}interfaceIFolderOrItem:IFolderOrItemwhereTFolderOrItem:FolderOrItem{}键入ItemType{get;}以指示考虑的实际类型。然后用法:IFolderOrItemSelectedItem{get;放;}...publicvoidSomeMagicMethod(){this.SelectedItem=GetMagicDocument();//不需要转换//不是**so**坏}根据规范,这涉及§25.5.6(ECMA334v4):25.5.6转换构造类型遵循与非泛型类型相同的转换规则(§13).在应用这些规则时,构造类型的基类和接口应按§25.5.3中的描述确定。除了§13中描述的那些之外,在构造的引用类型之间没有特殊的转换。特别是,与数组类型不同,构造引用类型不允许协变转换(第19.5节)。这意味着类型List没有到List的转换(隐式或显式),即使B是从A派生的。同样,没有从List到List的转换。[注意:这样做的理由很简单:如果允许转换为List,那么很明显,可以将类型A的值存储到列表中。但是,这会破坏类型List列表中的每个对象始终是类型B的值的不变性,否则在分配给集合类时可能会意外失败。结束语]这同样适用于接口。这在C#4.0中发生了变化,但仅在特定情况下发生。就编译器而言,IFolderOrItem和IFolderOrItem是两种完全不同的类型。Document可以继承Item,但IFolderOrItem不能。我依靠Marc或Jon发布指向C#规范相关部分的链接。问题是,强制转换不适用于泛型参数,而是应用于整个类。Documentation继承自Item,true,但IFolderOrItem不继承自,也不以任何方式与之相关。了解其为何如此工作的示例:假设IFolderOrItem公开了一个方法,比如voidAdd(Telement)。您的IFolderOrItem实现将假定参数是文档。但是您将IFolderOrItem转换为IFolderItemOrItem,然后有人可以调用方法Create(T),其中T应该是一个项目。从项目到文档的转换无效,因为项目不是文档。做到这一点的唯一方法是创建接口的非通用版本,允许将对象作为参数,并在实现中检查对象的类型。以上是C#学习教程:为什么这个actor不可能?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
