11

を見るとSystem.Collections.Generic.Dictionary<TKey, TValue>、明らかに を実装していますが、必要な " " 機能ICollection<KeyValuePair<TKey, TValue>>がありません。void Add(KeyValuePair<TKey, TValue> item)

Dictionaryこれは、次のように初期化しようとしたときにも見られます。

private const Dictionary<string, int> PropertyIDs = new Dictionary<string, int>()
{
    new KeyValuePair<string,int>("muh", 2)
};

失敗する

メソッド 'Add' のオーバーロードは '1' 引数を取らない

どうしてこんなことに?

4

3 に答える 3

18

予想される API は、2 つの引数のAdd(key,value)メソッド (またはthis[key]インデクサー) を介して追加することです。そのため、明示的なインターフェイスの実装を使用してAdd(KeyValuePair<,>)メソッドを提供します。

代わりにインターフェイスを使用するIDictionary<string, int>と、不足しているメソッドにアクセスできます (インターフェイスでは何も非表示にできないため)。

また、コレクション初期化子では、別の構文を使用できることに注意してください。

Dictionary<string, int> PropertyIDs = new Dictionary<string, int> {
  {"abc",1}, {"def",2}, {"ghi",3}
}

メソッドを使用しAdd(key,value)ます。

于 2008-11-06T09:38:01.617 に答える
9

一部のインターフェイス メソッドは明示的に実装されています。リフレクターを使用すると、次のような明示的に実装されたメソッドを確認できます。

void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> keyValuePair);
bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> keyValuePair);
void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int index);
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> keyValuePair);
IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator();
void ICollection.CopyTo(Array array, int index);
void IDictionary.Add(object key, object value);
bool IDictionary.Contains(object key);
IDictionaryEnumerator IDictionary.GetEnumerator();
void IDictionary.Remove(object key);
IEnumerator IEnumerable.GetEnumerator();
于 2008-11-06T09:41:28.677 に答える
0

ICollection<KeyValuePair<K,V>>直接実装しません。実装しIDictionary<K,V>ます。

IDictionary<K,V>から派生しICollection<KeyValuePair<K,V>>ます。

于 2008-11-06T09:48:03.733 に答える