2010-07-31 38 views
2
public interface IMyControl<in T> where T : ICoreEntity 
{ 
    void SetEntity(T dataObject); 
} 

public class MyControl : UserControl, IMyControl<DataObject> // DataObject implements ICoreEntity 
{ 
    void SetEntity(T dataObject); 
} 

目前爲止還好,但爲什麼會創建null?逆變不起作用

var control = LoadControl("~/Controls/MyControl.ascx"); // assume this line works 
IMyControl<ICoreEntity> myControl = control; 

myControl現在是空...

+4

所有不精至今。這段代碼甚至沒有編譯。 T在第二課中宣佈在哪裏?被認爲是DataObject而不是T? – 2010-08-01 01:06:20

回答

2

你不能有dataObject作爲參數,這個工作。方法只能返回它。

public interface ICoreEntity { } 
public class DataObject: ICoreEntity { } 

public interface IMyControl<out T> where T : ICoreEntity 
{ 
    T GetEntity(); 
} 

public class MyControl : IMyControl<DataObject> // DataObject implements ICoreEntity 
{ 
    public DataObject GetEntity() 
    { 
     throw new NotImplementedException(); 
    } 
} 

現在,您可以:

MyControl control = new MyControl(); 
IMyControl<ICoreEntity> myControl = control; 
+0

這不是協變性嗎?我認爲他們推出了out關鍵字才能使其工作?無論如何編譯 – Paul 2010-07-31 13:16:04

+0

是的,這是協變,但你打算使用它的方式是協方差。看看這裏:http://msdn.microsoft.com/en-us/library/ee207183.aspx – 2010-07-31 13:17:28