简体   繁体   English

C#:通用接口转换错误

[英]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> . 我有IPresenterIViewPresenterBase<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. 尽管TTPresenter正在实现IPresenter ,但是编译器认为没有相同的对象,例如:您有一个IAnimal ,而CatDog实现了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM