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的来源,它将实现该方法。所以我的问题是,怎么可能呢?
根据错误消息显式实现该方法。这意味着需要对给定接口进行显式强制转换。在您的第二个示例中,这将起作用:
((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。