Программное обеспечение ITA использует изрядное количество CL.
Вы можете использовать методы расширения Cast
и ToList
из System.Linq, чтобы поместить это в одну строку.
Вместо
internal List<Obj> returnStuff()
{
return getSomeStuff() as List<Obj>;
}
сделайте это:
internal List<Obj> returnStuff()
{
return getSomeStuff().Cast<Obj>().ToList();
}
Ковариант, друг мой. Взгляните на http://blog.tlk.com/dot-net/2009/c-sharp-4-covariance-and-contravariance
Я могу описать только "проблема" с точки зрения Java, но насколько мне известно, этот аспект одинаков как в C #, так и в Java:
A List
не является List
, потому что он может содержать объект ObjBase
, который не является объектом Obj
.
Другой способ обойти List
может ] not должно быть преобразовано в List
, потому что первый гарантирует принятие вызова Add ()
с аргументом ObjBase
, который последний не будет принимать!
Итак, подведем итог: даже если Obj
является ObjBase
a List
- это , а не List
.
Я думаю, что вы неправильно понимаете состав, который пытаетесь сделать. Вы думаете, что меняете тип объекта, который хранится в списке, где вы фактически пытаетесь изменить тип самого списка. Скорее имеет смысл, что вы не можете изменить сам список, поскольку вы его уже заполнили.
Вы можете рассматривать его как список базового класса, а затем преобразовывать его, когда вы обрабатываете элементы списка, что будет мой подход.
Какова цель этой попытки заброса?
В настоящее время C # не поддерживает вариативность для универсальных типов. Судя по тому, что я читал, это изменится в 4.0.
См. здесь для получения дополнительной информации о дисперсии в обобщенных шаблонах.
Linq имеет метод ConvertAll. так что что-то вроде
list.ConvertAll<Obj>(objBase => objbase.ConvertTo(obj));
Я не знаю, что еще предложить. Я предполагаю, что ObjBase является базовым классом, и если все объекты ObjBase являются объектами Obj, я не уверен, зачем вам вообще нужны эти два объекта. Возможно, я ошибаюсь.
Изменить: метод list.Cast будет работать лучше, чем приведенный выше, при условии, что они могут быть преобразованы друг в друга. Забыл об этом, пока не прочитал другие ответы.
Это главная проблема C # - именно так создавались дженерики. Список не расширяет список, это просто совершенно другой тип. Вы не можете преобразовать или назначить их друг другу, единственный вариант - скопировать один список в другой.
Лазарь :
Я думал, что компилятор поймет, что я хочу, чтобы действия выполнялись над объектами списка, а не то, что я пытался преобразовать сам список.
Дополнительная информация:
public abstract class ObjBase
{
}
internal interface IDatabaseObject
{
}
public class Obj : ObjBase, IDatabaseObject
{
}
internal interface IDatabaseObjectManager
{
List<ObjBase> getSomeStuff();
}
public class ObjManager : IObjManager
{
public List<Obj> returnStuff()
{
return getSomeStuff().Cast <Customer>().ToList<Customer>();
}
private List<ObjBase> getSomeStuff()
{
return new List<ObjBase>();
}
}
Теперь клиентский код вне этой DLL может пойти:
ObjManager objM = новый ObjManager ();
Список listOB = objM.returnStuff ();
Я собираюсь создать несколько типов Obj
и ObjManager
для этой части (O / RM) приложения.
(В блоке комментариев, черт возьми, закончились символы!: - )