C#:通用接口转换错误

时间:2016-07-28 01:01:21

标签: c# generics

我实际上是在尝试为我的系统制作一个基础MVP框架。我有IPresenterIViewPresenterBase<IView>ViewBase<IPresenter>

以下是代码:

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
    }
}

当我尝试使用AttachPresenter方法设置Presenter时,出现此错误:

“无法将类型'T'隐式转换为'TPresenter'”

为什么呢?两者都在实施IPresenter。我该如何解决?我希望这些泛型类能够实现系统中的每个视图和演示者。

抱歉英语不好,希望你能理解。

2 个答案:

答案 0 :(得分:1)

由于您需要使用相同类型的演示者:

public void AttachPresenter(TPresenter presenter) 
{
    Presenter = presenter;  
}

答案 1 :(得分:1)

虽然TTPresenter正在实施IPresenter,但编制者认为没有相同的对象,例如:您有IAnimal,而且Cat {1}}和Dog实施IAnimal,但您不能像Cat这样Dog分配dog = cat,我认为这就是原因。

所以,为什么不将你的功能改为

public void AttachPresenter(TPresenter presenter)
{
    Presenter = presenter;  
}