Контравариантность не работает - PullRequest
2 голосов
/ 31 июля 2010
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 теперь нулевой ...

1 Ответ

2 голосов
/ 31 июля 2010

Вы не можете иметь 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;
...