Почему я получаю ошибку «Параметр типа должен быть неизменным…»?

Я попытаюсь сократить этот пример кода:

public interface IThing
{
    //...  Stuff
}

public class Thing1 : IThing
{  
}

public class Thing2 : IThing
{  
}

public interface IThingView<out T>
{
    ICollection<T> ViewAll();
}

public class ThingView<T> : IThingView<T>
{
    ICollection<T> ViewAll() { return new List<T>(); }  //  There's a big operation here
}

public interface IThingViewerFactory
{
    public IThingView<IThing> Build(string Which);
}

public class ThingViewerFactory
{
    public IThingView<IThing> Build(string Which)
    {
        if(Which.Equals("Thing1") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
        else { return new (IThingView<IThing>)new ThingViewer<Thing2>();}
    }
}

Это приблизительное представление о том, что я делаю. У меня есть несколько классов Thing, которым требуется программа просмотра, которая будет следовать общему интерфейсу. Я хотел бы, чтобы фабрика генерировала их, передавая строку с именем. Я все время получаю сообщение об ошибке компилятора:

Недопустимая дисперсия: параметр типа «T» должен быть инвариантно допустимым для «IThingView.ViewAll ()». 'T' ковариантна.

Я понимаю, что даже если я заставлю это работать, мне придется потом провести кастинг ... Меня это устраивает. И я понимаю, что в таком подходе, скорее всего, нет необходимости. На данный момент это стало скорее проблемой из гордости / любопытства.

Спасибо!

7
задан TheTFo 26 May 2011 в 17:38
поделиться