为什么ICollection索引在实例化时不起作用?

dem*_*tos 20 c# indexing list icollection

当我们将参数声明为ICollection并将对象实例化为List时,为什么我们无法检索索引?即

ICollection<ProductDTO> Products = new List<ProductDTO>();
Products.Add(new ProductDTO(1,"Pen"));
Products.Add(new ProductDTO(2,"Notebook"));
Run Code Online (Sandbox Code Playgroud)

然后,这将无效:

ProductDTO product = (ProductDTO)Products[0];
Run Code Online (Sandbox Code Playgroud)

我错过了什么?
[是的,我们可以使用List作为声明,它可以工作,但我不想声明为列表,如:

List<ProductDTO> Products = new List<ProductDTO>();
Run Code Online (Sandbox Code Playgroud)

]

jer*_*mcc 33

使用LINQ,您可以这样做:

ProductDTO product = (ProductDTO)Products.ElementAt(0);
Run Code Online (Sandbox Code Playgroud)


Chr*_*Rea 28

ICollection的接口不声明索引器,这样你就不能使用索引通过该类型的引用来获取元素.

你也许可以尝试IList,它增加了一些功能,同时仍然是抽象的.当然,这可能会影响其他设计决策,所以我会仔细研究.

  • @Inanikian没有“最佳”;这取决于上下文。如果必须在IList &lt;T&gt;中使用方法,例如,如果需要索引/排序,则IList &lt;T&gt;可能是所需的最佳接口类型。另一方面,如果您只在乎计数,添加,删除和枚举项目,而从不按索引进行,并且不想对类具有索引器和所有其他功能的附加功能施加要求由IList &lt;T&gt;暗示您仍然不会使用,那么最好只要求您需要的内容,例如ICollection &lt;T&gt;(如果您不进行任何修改,甚至是IEnumerable &lt;T&gt;)。 (2认同)

Cha*_*ion 7

ICollection没有定义索引器.

ICollection非通用

ICollection Generic


Cec*_*ame 5

然后这将起作用:

ProductDTO product = ((IList<ProductDTO>)Products)[0];
Run Code Online (Sandbox Code Playgroud)

原因是编译器评估左值(即'='左侧的变量),以找出它知道可以在编译时访问的方法和属性。这称为静态类型,它通过静态知道对象成员始终可访问来确保可以在运行时直接访问对象成员。

  • 您和我对“修复”一词有不同的定义!;-) (2认同)