Почему словарь C # не реализует все IDictionary?

Я хотел создать объект, похожий на словарь, и подумал, что правильным способом было бы реализовать интерфейс IDictionary и использовать композицию для включения базового словаря. Я начал со следующего ( K = строка , V = int )

public class DictionaryLikeObject : IDictionary {
  Dictionary _backingDictionary = new Dictionary();
}

Затем я использовал Visual Studio «Интерфейс реализации» возможность убрать все необходимые мне методы обложки.

Три метода IDictionary , похоже, не существуют в Словаре :

void Add(KeyValuePair item);
void CopyTo(KeyValuePair[] array, int arrayIndex);
bool Remove(KeyValuePair item);

Тем не менее документация Microsoft четко указывает, что Dictionary реализует IDictionary . Поэтому я ожидал, что эти три метода будут доступны. Чтобы скопировать из документации определение Dictionary

[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Dictionary : IDictionary, 
ICollection>, IEnumerable>, 
IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback

Я полагаю, что эти три недостающих метода находятся в ICollection . Но также существуют другие методы, такие как Clear () , которые есть в Dictionary .

Вопрос 1: Как можно обойтись C # без реализации этих трех и почему так? Я подозреваю, что это ошибка компилятора (мои рассуждения см. Ниже). Вопрос 2: В качестве альтернативы, что мне не хватает?

Вот почему я думаю, что это может быть ошибка компилятора. Изучите следующий код:

Dictionary dictionary1 = new Dictionary();
IDictionary dictionary2 = new Dictionary();
KeyValuePair item = new KeyValuePair("test", 1);
//dictionary1.Add(item); // compile error: No overload for method 'Add' takes 1 argument
dictionary2.Add(item); // works like a charm
Debug.WriteLine(@"dictionary2[""test""] = {0}", dictionary2["test"]); // outputs: dictionary2["test"] = 1

Метод void Add (KeyValuePair item) , похоже, отсутствует в Dictionary (поскольку он не скомпилировать), но он находится в IDictionary , и каким-то образом компилятор правильно находит его реализацию. Вопрос 3: Что происходит?

Обратите внимание, что документация Microsoft для Dictionary не определяет эти три метода.

Наконец, в моей реальной реализации , В итоге я использовал

IDictionary _backingDictionary = new Dictionary();

вместо

Dictionary _backingDictionary = new Dictionary();

, так что все три метода могли легко работать.

26
задан svick 26 August 2011 в 21:22
поделиться