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,它增加了一些功能,同时仍然是抽象的.当然,这可能会影响其他设计决策,所以我会仔细研究.
然后这将起作用:
ProductDTO product = ((IList<ProductDTO>)Products)[0];
Run Code Online (Sandbox Code Playgroud)
原因是编译器评估左值(即'='左侧的变量),以找出它知道可以在编译时访问的方法和属性。这称为静态类型,它通过静态知道对象成员始终可访问来确保可以在运行时直接访问对象成员。