LinkedList不包含显式的Add方法

时间:2016-01-12 16:29:59

标签: c#

我发现了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方法。 所以我的问题是,它怎么可能?

3 个答案:

答案 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的隐式定义。

使用AddLastLinkedList方法或用作ICollection接口(实例化或转换),特别是将Add方法实现为AddLast。