C#:通用接口转换错误

C#:通用接口转换错误,c#,generics,C#,Generics,实际上,我正在尝试为我的系统创建一个基本的MVP框架。我有IPresenter,IView,PresenterBase和ViewBase 代码如下: public interface IPresenter { IAppController GetAppController(); } public interface IView { void AttachPresenter<T>(T presenter) where T : IPresenter; } public

实际上,我正在尝试为我的系统创建一个基本的MVP框架。我有
IPresenter
IView
PresenterBase
ViewBase

代码如下:

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
    }
}
公共接口IPresenter
{
IAppController GetAppController();
}
公共接口IView
{
无效附件提交人(T提交人),其中T:I提交人;
}
公共抽象类BasePresenter:IPresenter,其中TView:class,IView
{
受保护的只读TView视图;
受保护的只读IAppController-AppController;
受保护的BasePresenter(TView视图、IAppController和appController)
{
视图=视图;
AppController=AppController;
View.AttachPresenter(此);
}
公共IAppController GetAppController()
{
返回控制器;
}
}
公共类BaseView:Form,IView其中TPresenter:class,IPresenter
{
受保护的TPresenter演示器;
公共无效附件演示者(T演示者),其中T:I演示者
{

Presenter=Presenter;//因为您需要相同类型的Presenter,所以您只需使用:

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

由于您需要相同类型的演示者,因此可以使用:

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

虽然
T
TPresenter
正在实现
i当前者
,但编译器并不认为存在相同的对象,例如:您有一个
IAnimal
,并且
Cat
Dog
实现
IAnimal
,但您不能像这样将
Cat
分配给
Dog
我想这就是原因

那么,为什么不把函数改为

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

虽然
T
TPresenter
正在实现
i当前者
,但编译器并不认为存在相同的对象,例如:您有一个
IAnimal
,并且
Cat
Dog
实现
IAnimal
,但您不能像这样将
Cat
分配给
Dog
我想这就是原因

那么,为什么不把函数改为

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

尝试
where T:class,IPresenter
try
where T:class,IPresenter
如何在界面中实现
void AttachPresenter(TPresenter-presenter)
?void AttachPresenter(IPresenter-presenter)但是是的,您也需要将您的私有字段更改为IPresenter。我如何实现
void AttachPresenter(TPresenter presenter)
在界面中?作废AttachPresenter(IPresenter presenter),但是是的,您也需要将您的私有字段更改为IPresenter。如何添加
作废AttachPresenter(TPresenter presenter)
在界面中?因为我想在BaseView中实现IView。将IView更改为
公共界面IView,其中T:IPresenter
并将此界面中的函数更改为“void AttachPresenter(TPresenter presenter)”;如何添加
void AttachPresenter(TPresenter presenter)
在界面中?因为我想在BaseView中实现IView。请将IView更改为
公共界面IView,其中T:IPresenter
并将此界面中的函数更改为“void AttachPresenter(TPresenter presenter);”