问题
When we declare a parameter as ICollection and instantiated the object as List, why we can't retrive the indexes? i.e.
ICollection<ProductDTO> Products = new List<ProductDTO>();
Products.Add(new ProductDTO(1,"Pen"));
Products.Add(new ProductDTO(2,"Notebook"));
Then, this will not work:
ProductDTO product = (ProductDTO)Products[0];
What is the bit I am missing?
[Yes, we can use List as declaration an it can work, but I don't want to declare as list, like:
List<ProductDTO> Products = new List<ProductDTO>();
]
回答1:
The ICollection interface doesn't declare an indexer, so you can't use indexing to fetch elements through a reference of that type.
You could perhaps try IList, which adds some more functionality, while still being abstract. Of course, this may impact other design decisions so I would look at this carefully.
回答2:
Using LINQ, you can do this:
ProductDTO product = (ProductDTO)Products.ElementAt(0);
回答3:
ICollection does not define an indexer.
ICollection Non-Generic
ICollection Generic
回答4:
Then this will work:
ProductDTO product = ((IList<ProductDTO>)Products)[0];
The reason is that the compiler evaluates the lvalue, that is the variable on the left side of '=', to find out which methods and properties it knows it can access at compile-time. This is known as static typing, and ensures that an object member can be accessed directly at runtime by statically knowing that the member is always reachable.
回答5:
The basic problem is that ICollection doesn't define an index. For the List this is done by the implementation of IList.
Try this:
IList<ProductDTO> Products = new List<ProductDTO>();
Alternatly, you can keep using ICollection and convert to an array when you need to access the elements by the index:
ICollection<ProductDTO> Products = new List<ProductDTO>();
ProductDTO z = Products.ToArray()[0];
回答6:
Using Linq, you can access an element in an ICollection<> at a specific index like this:
myICollection.AsEnumerable().ElementAt(myIndex);
回答7:
You can also use extension methods to convert it to (list, array) of ProductDTO
ICollection<ProductDTO> Products = new List<ProductDTO>();
var productsList = Products.ToList();
Then you can use it like that:
productsList[index]
来源:https://stackoverflow.com/questions/1875655/why-icollection-index-does-not-work-when-instantiated