我试图理解为什么下面的代码不能编译。编译器在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
)。这是错误的,因为
MyView
与TView
不同,所以无法分配。编辑:
扩大一点…
您可以为其接口分配类型,例如:
IView v = new MyView(); // OK !
但不能将接口分配给其实现者之一,例如:
IView v = ...;
MyView myView = v; // WRONG !
你在做一些更复杂的事情,比如:
IView
_______|_______
| |
| |
TView <-- MyView
这显然是错误的。
事实上,即使
TView
和MyView
实现了相同的接口,要允许这个TView
应该继承自MyView
但这不是在泛型约束中指定的,所以编译器不能做任何假设。还要查看davy8's answer以获得一个清晰的示例:)