Таким образом, поскольку нас не волнует фактический тип элементов в коллекции, все, что мы получаем, это объекты. Примечание: если в коллекции содержались примитивные типы (например, int или byte), то запускаются автобокс, что может привести к снижению производительности.
рабатываю приложение, в котором мне нужно вызвать метод универсального класса, и меня не волнует фактический тип экземпляров. Что-то вроде следующего кода Java:
public class Item<T>{
private T item;
public doSomething(){...}
}
...
public void processItems(Item<?>[] items){
for(Item<?> item : items)
item.doSomething();
}
В то время, когда я спешил, я решил свою проблему, определив интерфейс с методами, которые мне нужны для вызова, и заставил универсальный класс реализовать его.
public interface IItem
{
void doSomething();
}
public class Item<T> : IItem {
private T item;
public void doSomething(){...}
}
...
public void processItems(IItem[] items)
{
foreach(IItem item in items)
item.doSomething();
}
Этот обходной путь работает хорошо, но я хотел бы знать, как правильно добиться того же поведения.
РЕДАКТИРОВАТЬ:
Я забыл сослаться, что вызывающийprocessItems
не знает фактические типы. На самом деле идея состояла в том, чтобы массив передавался в качестве аргументаprocessItems
может содержать смешанные типы. Поскольку такой массив в .Net не представляется возможным, использование неуниверсального базового класса или интерфейса представляется единственным способом.