【发布时间】: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”物化实例作为通用参数。我看不出我怎么能定义它。谢谢。