2011-03-01 69 views
4

我想了解为什么以下不会编译。编译器在CreatePresenter尝试设置View属性的行上抱怨:不知道为什么这不会编译

不能将类型'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(); 
     } 
    } 
+0

您正在使用什么版本的.NET? – Oded 2011-03-01 20:34:43

+0

你得到哪个错误? – 2011-03-01 20:35:18

+0

我正在使用.NET 4.0 – Marco 2011-03-01 20:35:30

回答

7

就行了:

this.Presenter.View = new MyView(); 

你想一个MyView对象设置为通用型TView(实施IView)的属性。

这是错误的,因为MyView不同于TView所以它不能被分配。

编辑:

要展开一个有点...

可以一个类型分配给它的接口如:

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

,但你不能接口分配给它的实施者之一例如:

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

在这里,你正在做的事情更令人费解的,是这样的:

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

这显然是错误的。
事实上,即使TViewMyView实现相同的接口,为了允许这TView应该从MyView继承,但这不是泛型约束中指定的,因此编译器不能做任何假设。

看一看也davy8's answer

+0

我打算提交我的答案时,这与V类似的描述出现;)+1。即使MyView实现了IView, – 2011-03-01 20:38:17

+0

? – Marco 2011-03-01 20:38:21

+1

@Marco无关紧要,因为例如int和BigInt都实现了IComparable,所以不能将BigInt设置为int。 – 2011-03-01 20:40:38

0

MyView是不能保证是同一类型TView一个明显的例子:)。您可以使用此通用类的IView的多个实现不是MyViews

如果您将ViewBase更改为下面的代码,至少会进行编译。我不确定它会如何影响应用程序的行为。

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

    public TPresenter Presenter { get; private set; } 

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

想象一下,你有2个班:

class MyView2 : IView 
{ 
} 

class MyPresenter2 : Presenter<MyView2> 
{ 
    public MyPresenter2() { } 
} 

然后尝试建立与新ViewBase:

var viewBase = new ViewBase<MyPresenter2, MyView2>(); 

在这种情况下,在你的方法:

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

this.Presenter.ViewMyView2它不从MyView继承,即使它们都实现IView

+0

pefect,谢谢! – Marco 2011-03-01 20:54:13

相关问题