我试图理解为什么以下内容无法编译。编译器在 CreatePresenter 尝试设置 View 属性的行上提示:
Cannot implicitly convert type 'Sandbox.Program.MyView' to '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
不同,因此无法分配。
编辑:
扩大一点...
您可以为其接口(interface)分配一个类型,例如:
IView v = new MyView(); // OK !
但是您不能将接口(interface)分配给它的实现者之一,例如:
IView v = ...;
MyView myView = v; // WRONG !
这里你正在做一些更复杂的事情,像这样:
IView
_______|_______
| |
| |
TView <-- MyView
这显然是错误的。
事实上,即使 TView
和 MyView
实现了相同的接口(interface),要允许这个 TView
应该继承自 MyView
但是这在通用约束中没有指定,因此编译器不能做任何假设。
也看看davy8's answer一个清楚的例子:)
关于c# - 无法弄清楚为什么这不会编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159980/