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

标签 c# .net .net-4.0

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

相关文章:

.net - .NET 4 中的 IDictionary<TKey, TValue> 不是协变的

wpf数据网格错误?当在具有图像作为标题内容的列上切换可见性时

c# - .net sql 异常处理 - 如何获取 sp 参数/值

c# - 引用 C# 中的引用?

c# - 如何获取使用 FileSystemWatcher 创建的新文件的名称?

c# - ASP.NET MVC 如何知道如何填充您的模型以提供 Controller 的操作?它涉及反射(reflection)吗?

c# - 我需要在 SQL 查询中转义哪些字符

C#:如何访问窗体类外部的按钮

c# - 将word 2010中富内容控件的内容转成html格式

c# - Enum.GetName 的奇怪行为