Я попытаюсь сократить этот пример кода:
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' ковариантна.
Я понимаю, что даже если я заставлю это работать, мне придется потом провести кастинг ... Меня это устраивает. И я понимаю, что в таком подходе, скорее всего, нет необходимости. На данный момент это стало скорее проблемой из гордости / любопытства.
Спасибо!