【问题标题】:´class´ does not contains a definition for ´method´ but it´s there [duplicate]“类”不包含“方法”的定义,但它在那里[重复]
【发布时间】:2018-06-18 22:13:14
【问题描述】:

我有一个类如下

public class EntityBase
{
    // other code
    public virtual void SetDataContext(IDataContext context) { throwNotImplemented("SetDefaultDataContext"); }

    protected void throwNotImplemented( string mname )
    {
        throw new Exception( String.Format( "Method {0} is not implemented") );                
    }
}

throwNotImplemented 的目的是强制派生类实现虚拟方法,就好像它们是抽象的一样。

然后我有一个引用EntityBase的类,如下

public class BasePresenter<IDataContextFactory, IDataContext, EntityBase> 
        where IDataContextFactory : class, new() where IDataContext : class where EntityBase : class
{
    public IDataContext dataContext;
    public BasePresenter( IDataContext dc, EntityBase sample)
    {
        dataContext = dc;
        sample.SetDataContext(dataContext);
    }
// more code 
}

编译器卡在这个错误中:

“EntityBase”不包含“SetDataContext”的定义,也没有扩展方法...等

谁或什么是错的?

TIA

【问题讨论】:

  • 如果您遵循通用参数的公认命名约定,则对您的示例进行推理会容易得多,例如,每个参数都应以 T 为前缀(如 TDataContext)。如果你这样做了,答案对你来说甚至可能是显而易见的。
  • @MikeStrobel 重要的通用参数是(准确地说)EntityBase,所以约定不会发生,恕我直言。事实上,如果我遵循命名约定,对我来说什么是显而易见的?谢谢
  • @MikeStrobel 将泛型参数更改为“约定”,编译器的错误没有任何不同。
  • 正如另一个人所说,使用“EntityBase”这个词作为泛型参数的名称(或专有名词是什么?)会导致大量歧义(泛型类型占位符或实际类型是什么意思? )。基本上你有这个问题:youtube.com/watch?v=oLwVKYS-iSs如果你已经改变了,请更新问题。
  • @Christopher 好的,但我“需要”一个“EntityBase”物化实例作为通用参数。我看不出我怎么能定义它。谢谢。

标签: c# virtual


【解决方案1】:

在您的泛型类中,标识符EntityBase 表示一个泛型参数。这会将名为 EntityBase 的类隐藏在范围之外。特别是,这意味着

我有一个引用 EntityBase 的类

错了。

由于泛型参数EntityBase 的唯一约束是: class,因此您只能使用object 上的成员,例如GetHashCode()GetType()ToString()

【讨论】:

    【解决方案2】:

    您在 中使用 EntityBase 作为泛型类型参数,并将其限制为“类”类型的后代。所以任何课程。因此编译器无法知道 EntityBase 是否是您的 EntityBase 类的实际分离。您可能想要做的只是从 .

    之间剥离 EntityBase 泛型类型

    【讨论】:

    • 我的错。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2012-09-10
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多