Почему индекс ICollection не работает при создании экземпляра?

Когда мы объявляем параметр ICollection и создаем объект как List, почему мы не можем извлекать индексы? то есть.

ICollection<ProductDTO> Products = new List<ProductDTO>();
Products.Add(new ProductDTO(1,"Pen"));
Products.Add(new ProductDTO(2,"Notebook"));

Тогда это не сработает:

ProductDTO product = (ProductDTO)Products[0];

Какой бит мне не хватает?
[Да, мы можем использовать List как объявление, и он может работать, но я не хочу объявлять как список, например:

List<ProductDTO> Products = new List<ProductDTO>();

]

Ответ 1

Интерфейс ICollection не объявляет индексатор, поэтому вы не можете использовать индексацию для извлечения элементов через ссылку этого типа.

Возможно, вы можете попробовать IList, который добавляет еще некоторые функциональные возможности, будучи абстрактным. Конечно, это может повлиять на другие проектные решения, поэтому я бы внимательно посмотрел на это.

Ответ 2

Используя LINQ, вы можете сделать это:

ProductDTO product = (ProductDTO)Products.ElementAt(0);

Ответ 4

Основная проблема заключается в том, что ICollection не определяет индекс. Для списка это выполняется реализацией IList.

Попробуйте следующее:

IList<ProductDTO> Products = new List<ProductDTO>(); 

В качестве альтернативы вы можете продолжать использовать ICollection и преобразовывать в массив, когда вам нужно получить доступ к элементам по индексу:

ICollection<ProductDTO> Products = new List<ProductDTO>();        
ProductDTO z = Products.ToArray()[0];

Ответ 5

Тогда это будет работать:

ProductDTO product = ((IList<ProductDTO>)Products)[0];

Причина в том, что компилятор оценивает значение lvalue, то есть переменную в левой части '=', чтобы узнать, какие методы и свойства, которые он знает, могут получить во время компиляции. Это называется статической типизацией и гарантирует, что к объекту можно получить доступ непосредственно во время выполнения, статически зная, что элемент всегда доступен.

Ответ 6

Используя Linq, вы можете получить доступ к элементу в ICollection < > по определенному индексу, например:

myICollection.AsEnumerable().ElementAt(myIndex);