2010-07-31 16 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); 
} 

Все до сих пор, но почему это создает нуль?Контравариантность не работает

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

MyControl теперь нулевой ...

+4

Все это не нормально до сих пор. Этот код даже не компилируется. Где T объявлено во втором классе? Было ли это указано DataObject вместо T? –

ответ

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

Разве это не ковариация, а не контравариантность? Я думал, что они ввели ключевое слово, чтобы это работало? Он компилируется в любом случае – Paul

+0

Да, это ковариация, но способ, которым вы собираетесь ее использовать, - это ковариация. Взгляните сюда: http://msdn.microsoft.com/en-us/library/ee207183.aspx –

Смежные вопросы