C# 为什么';t字典<;TKey,TValue>;没有接受KeyValuePair对象的Add方法?
根据.NET API,类C# 为什么';t字典<;TKey,TValue>;没有接受KeyValuePair对象的Add方法?,c#,.net,inheritance,collections,interface,C#,.net,Inheritance,Collections,Interface,根据.NET API,类Dictionary继承自ICollection,其中T是KeyValuePair。Dictionary类如何隐藏它从ICollection继承的一些方法 例如: ICollection具有方法ICollection.Add(T项) 但是当您使用字典对象时,它没有该方法。您只能使用字典。添加(TKey键,TValue值)。没有字典。添加(KeyValuePair kvp)方法 有人知道为什么吗?这些方法是如何隐藏的?它们是“隐藏”的。因此,您可以使用: ICollecti
Dictionary
继承自ICollection
,其中T
是KeyValuePair
。Dictionary
类如何隐藏它从ICollection
继承的一些方法
例如:
ICollection
具有方法ICollection.Add(T项)
但是当您使用字典对象时,它没有该方法。您只能使用字典。添加(TKey键,TValue值)
。没有字典。添加(KeyValuePair kvp)
方法
有人知道为什么吗?这些方法是如何隐藏的?它们是“隐藏”的。因此,您可以使用:
ICollection<KeyValuePair<Foo, Bar>> collection = dictionary;
collection.Add(...);
ICollection collection=字典;
集合。添加(…);
根据应该有效的。。。尽管通常只是使用另一种方法。因为字典有一个显式实现ICollection.Add
。在使用它之前,您需要将它强制转换为ICollection
您可以在上看到实现
void ICollection.Add(
KeyValuePair KeyValuePair
)
这是通过显式实现接口并使此实现私有化/受保护来完成的。。。看
您总是可以将字典
强制转换为ICollection
,然后调用Add
——虽然我不会这样做,因为我不知道它是否会起作用……作为参考,显式实现的ICollection.Add()
方法的字典
代码是:
void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> keyValuePair)
{
this.Add(keyValuePair.Key, keyValuePair.Value);
}
void ICollection.Add(KeyValuePair KeyValuePair)
{
添加(keyValuePair.Key,keyValuePair.Value);
}
你应该可以使用它,因为它只是做你自己可能会做的事情。如果字典
直接暴露了一个添加(KeyValuePair)
重载,这表明如果一个人有一个KeyValuePair
(例如,当一个人枚举另一个字典时收到)将其传递给这样的方法比读取键
和值
属性并分别传递要好。事实上,情况正好相反:将整个结构传递给一个Add
方法,然后该方法必须对其进行分解,并将其成员传递给一个离散参数重载,这比将结构分解为其成员并分别传递它们的效率要低
请注意,如果字典
将内容存储在结构类型的数组中,该数组将KeyValuePair
作为字段(而非属性),则代码如下:
for var item in Dict1
{
Dict2.Add(item);
}
可能比
for var item in Dict1
{
Dict2.Add(item.Key, Item.Value);
}
但是由于字典
将分解传入的任何键值对
,因此没有理由鼓励使用前一种代码样式。谢谢,这正好回答了我的问题。在过去,我从未显式实现过接口,所以我没有意识到这是显式实现的效果。这种效果不是“自动”的,但只有当您从公共更改为私有/受保护时,例如通过匹配任何访问修饰符…谢谢Jon,您总是有很好的答案。我不知道显式接口实现。非常感谢。
for var item in Dict1
{
Dict2.Add(item.Key, Item.Value);
}