我发现了LinkedList<T>
的有趣行为。我不能为LinkedList&lt;&gt;的实例调用Add方法。但是LinkedList<T>
实现了ICollection<T>
(link),它实际上具有Add方法。
以下是示例。当我这样做时,它完美无缺:
ICollection<string> collection = new LinkedList<string>();
collection.Add("yet another string");
但是这段代码甚至无法编译:
LinkedList<string> linkedList = new LinkedList<string>();
linkedList.Add("yet another string");
编译说: “无法访问'ICollection.Add'的显式实现 “错误CS1061'LinkedList'不包含'Add'的定义,并且没有扩展方法'Add'接受类型'LinkedList'的第一个参数可以找到(你是否缺少using指令或汇编引用?)”
此外,如果要查看LinkedList的来源,它implements方法。 所以我的问题是,它怎么可能?
答案 0 :(得分:5)
根据错误消息,该方法是显式实现的。这意味着需要对给定接口进行显式转换。在你的第二个例子中,这将起作用:
((ICollection<string>)linkedList).Add("yet another string");
无论出于何种原因使用此技术,接口的实现者都可以选择 not 来使某些接口方法和属性成为本地公共接口类的一部分。
在LinkedList<T>
课程的情况下,作者显然更喜欢所有可能类型的添加&#39;功能(即AddFirst
/ AddLast
(而不是普通Add
)/ AddBefore
/ AddAfter
)使得抽象集合界面可以直接访问。但是,由于与调用方的显式实现兼容性,期望仍然维护ICollection<T>
,并且其Add
已转换为AddLast
调用,这在ICollection<T>
& #39;合同。 (虽然对此类设计决策的评估是主观的,但我补充一点,我认为这是件好事。)
答案 1 :(得分:1)
答案在编译器消息中:&#34;您无法访问显式实现方法&#34;
如果查看代码,您会看到实际上LinkedList明确地实现了ICollection。
您必须以这种方式将对象转换为ICollection:
((ICollection<string>)linkedList).Add("yet another string");
请查看以下链接以获取更多参考:
答案 2 :(得分:0)
LinkedList不包含Add的隐式定义。
使用AddLast的LinkedList方法或用作ICollection接口(实例化或转换),特别是将Add方法实现为AddLast。