Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';t字典<;TKey,TValue>;没有接受KeyValuePair对象的Add方法?_C#_.net_Inheritance_Collections_Interface - Fatal编程技术网

C# 为什么';t字典<;TKey,TValue>;没有接受KeyValuePair对象的Add方法?

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

根据.NET API,类
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);
}