我试图理解为什么下面的代码不能编译。编译器在CreatePresenter试图设置视图属性的行上投诉:
无法将类型“sandbox.program.myview”隐式转换为“tview”。
我知道作业的内容没有意义,更多的是为了说明。任何帮助都很好!

    interface IView {
    }

    class Presenter<T> where T : IView {
        public T View { get; set; }
    }

    class MyView : IView {
    }

    class MyPresenter : Presenter<MyView> {
        public MyPresenter() { }
    }

    class ViewBase<TPresenter, TView>
        where TPresenter : Presenter<TView>, new()
        where TView : IView {

        public TPresenter Presenter { get; private set; }

        void CreatePresenter() {
            this.Presenter = new TPresenter();
            this.Presenter.View = new MyView();
        }
    }

最佳答案

在线:

this.Presenter.View = new MyView();

您试图将MyView对象设置为泛型类型TView的属性(实现IView)。
这是错误的,因为MyViewTView不同,所以无法分配。
编辑:
扩大一点…
您可以为其接口分配类型,例如:
IView v = new MyView(); // OK !

但不能将接口分配给其实现者之一,例如:
IView v = ...;
MyView myView = v; // WRONG !

你在做一些更复杂的事情,比如:
        IView
   _______|_______
  |               |
  |               |
TView    <--   MyView

这显然是错误的。
事实上,即使TViewMyView实现了相同的接口,要允许这个TView应该继承自MyView但这不是在泛型约束中指定的,所以编译器不能做任何假设。
还要查看davy8's answer以获得一个清晰的示例:)

09-10 23:38