[英]C#: Generic Interfaces convert error
I'm actually trying to make a Base MVP framework for my system. 我实际上是在尝试为我的系统制作Base MVP框架。 I have
IPresenter
, IView
, PresenterBase<IView>
and ViewBase<IPresenter>
. 我有
IPresenter
, IView
, PresenterBase<IView>
和ViewBase<IPresenter>
。
Here is the code: 这是代码:
public interface IPresenter
{
IAppController GetAppController();
}
public interface IView
{
void AttachPresenter<T>(T presenter) where T : IPresenter;
}
public abstract class BasePresenter<TView> : IPresenter where TView : class, IView
{
protected readonly TView View;
protected readonly IAppController AppController;
protected BasePresenter(TView view, IAppController appController)
{
View = view;
AppController = appController;
View.AttachPresenter(this);
}
public IAppController GetAppController()
{
return AppController;
}
}
public class BaseView<TPresenter> : Form, IView where TPresenter : class, IPresenter
{
protected TPresenter Presenter;
public void AttachPresenter<T>(T presenter) where T : IPresenter
{
Presenter = presenter; // <-- ERROR HERE
}
}
When I try to set the Presenter with AttachPresenter
method, I get this error: 当我尝试使用
AttachPresenter
方法设置Presenter时, AttachPresenter
以下错误:
" Cannot implicitly convert type 'T' to 'TPresenter' " “无法将类型'T'隐式转换为'TPresenter'”
Why? 为什么? Both are implementing
IPresenter
. 两者都在实施
IPresenter
。 How can I solve it? 我该如何解决? I want this generic classes to implement every view and presenter in the system.
我希望这个通用类实现系统中的每个视图和演示者。
Sorry for bad english, I hope you understand. 对不起,英语不好,我希望你能理解。
Since you need same type of presenter you can just use: 由于您需要相同类型的演示者,因此您可以使用:
public void AttachPresenter(TPresenter presenter)
{
Presenter = presenter;
}
although T
and TPresenter
are implementing IPresenter
, but the complier don't think there are same object, for example: you have an IAnimal
, and both Cat
and Dog
implement IAnimal
, but you can NOT assign a Cat
to Dog
like this dog = cat
, i think that's the reason. 尽管
T
和TPresenter
正在实现IPresenter
,但是编译器认为没有相同的对象,例如:您有一个IAnimal
,而Cat
和Dog
实现了IAnimal
,但是您不能像Cat
dog = cat
Dog
这样将Cat
分配给Dog
,我认为这就是原因。
so, why not just change your function to 所以,为什么不只是将功能更改为
public void AttachPresenter(TPresenter presenter)
{
Presenter = presenter;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.