【问题标题】:C# generic method based on interface design基于接口设计的C#泛型方法
【发布时间】:2017-06-06 05:31:22
【问题描述】:

有一个类作为基础:

public abstract class DataObjectEntityItemBase
{ }

派生类:

public class CatalogDataObjectEntityItem : DataObjectEntityItemBase, ISupportsTabularDataObjectEntityContainer
{ }

有一个方法:

internal void FetchTabSectionDataObjectEntityByParentItem<T1>(
               ITabSectionManager dataObjectEntityContainerOwner, 
               T1 parentDataObjectEntityItem)                                                                                                                             
where T1 : DataObjectEntityItemBase, ISupportsTabularDataObjectEntityContainer
{ }

我想调用FetchTabSectionDataObjectEntityByParentItem的问题代码:

FetchTabSectionDataObjectEntityByParentItem(
       refDoeItem.LinkedConfigurationObject as ITabSectionManager, 
       refDoeItem as ISupportsTabularDataObjectEntityContainer);

错误:

错误 CS0311 类型 ISupportsTabularDataObjectEntityContainer 不能 在泛型类型或方法中用作类型参数“T1” FetchTabSectionDataObjectEntityByParentItem(ITabSectionManager, T1)'。没有隐式引用转换 ISupportsTabularDataObjectEntityContainer DataObjectEntityItemBase refDoeItem 是 DataObjectEntityItemBase 类型的变量。

refDoeItemDataObjectEntityItemBase 类型的变量。

【问题讨论】:

  • 除了您没有向我们展示所有相关代码之外,我会认为错误消息非常明显?
  • @MickyD,如您所见,我正在调用:“FetchTabSectionDataObjectEntityByParentItem(refDoeItem.LinkedConfigurationObject as ITabSectionManager, refDoeItem as ISupportsTabularDataObjectEntityContainer);”为什么“refDoeItem as ISupportsTabularDataObjectEntityContainer”与约束“where T1 : DataObjectEntityItemBase, ISupportsTabularDataObjectEntityContainer”不兼容?谢谢。
  • 什么是refDoeItem?我可能会让DataObjectEntityItemBase 意识到ISupportsTabularDataObjectEntityContainer

标签: c# .net generics interface base-class


【解决方案1】:

约束是编译时期间的一种机制,它保证必须调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。

在您的情况下,约束where T1 : DataObjectEntityItemBase, ISupportsTabularDataObjectEntityContainer 意味着实例应该从DataObjectEntityItemBase 派生并同时实现ISupportsTabularDataObjectEntityContainer

通过将 refDoeItem 不必要地强制转换为 ISupportsTabularDataObjectEntityContainer,您违反了这条规则。只需删除演员表,一切都会根据您定义的约束自动解决。但是如果您需要将其转换为另一种类型(例如 refDoeItem 是一个对象),您应该将其转换为符合整个约束的类型,在您的情况下为 CatalogDataObjectEntityItem

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2020-03-22
    • 2013-03-16
    • 2012-03-01
    • 2017-11-13
    • 2016-12-14
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多