gpt4 book ai didi

c# - 无法弄清楚为什么这不会编译

转载 作者:太空狗 更新时间:2023-10-30 00:35:16 24 4
gpt4 key购买 nike

我试图理解为什么以下内容无法编译。编译器在 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)。

这是错误的,因为 MyViewTView 不同,因此无法分配。

编辑:

扩大一点...

可以为其接口(interface)分配一个类型,例如:

IView v = new MyView(); // OK !

但是您不能将接口(interface)分配给它的实现者之一,例如:

IView v = ...;
MyView myView = v; // WRONG !

这里你正在做一些更复杂的事情,像这样:

        IView
_______|_______
| |
| |
TView <-- MyView

这显然是错误的。
事实上,即使 TViewMyView 实现了相同的接口(interface),要允许这个 TView 应该继承自 MyView 但是这在通用约束中没有指定,因此编译器不能做任何假设。

也看看davy8's answer一个清楚的例子:)

关于c# - 无法弄清楚为什么这不会编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com