LinkedList不包含显式Add方法

本文关键字:Add 方法 包含显 LinkedList | 更新日期: 2023-09-27 18:29:55

我发现LinkedList<T>的有趣行为。我无法为LinkedList<>的实例调用Add方法。然而,LinkedList<T>实现了ICollection<T>(链接),它实际上具有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"的定义,并且找不到接受"LinkedList'"类型的第一个参数的扩展方法"Add"(是否缺少using指令或程序集引用?)"

此外,如果要查看LinkedList的来源,它将实现该方法。所以我的问题是,怎么可能呢?

LinkedList不包含显式Add方法

根据错误消息显式实现该方法。这意味着需要对给定接口进行显式强制转换。在您的第二个示例中,这将起作用:

((ICollection<string>)linkedList).Add("yet another string");

无论出于何种原因使用此技术,接口的实现者都可以选择而不是,以使某些接口方法和属性成为类的本机公共接口的一部分。

LinkedList<T>类的情况下,与直接访问抽象集合接口相比,作者显然更喜欢对所有可能类型的"添加"功能(即AddFirst/AddLast(而不是普通的Add)/AddBefore/AddAfter)使用正则命名方案。然而,由于与期望ICollection<T>的调用方的显式实现兼容性仍然得到维护,并且其Add被转换为AddLast调用,这与ICollection<T>的约定相对应是合乎逻辑的。(虽然对这种设计决策的评估是主观的,但让我补充一点,我认为这是一件好事。)

答案在编译器消息中:"您不能访问显式实现方法"

如果你仔细查看代码,你会发现实际上LinkedList显式地实现了ICollection。

您必须以这种方式将对象强制转换为ICollection:

((ICollection<string>)linkedList).Add("yet another string");

查看这些链接以获取更多参考:

  • MSDN for Explicit接口

  • 为什么使用显式接口实现作为默认实现技术

LinkedList不包含要添加的隐式定义。

使用LinkedList的AddLast方法,或用作ICollection接口(实例化为它或强制转换),该接口将Add方法具体实现为AddLast。