Я хотел создать объект, похожий на словарь, и подумал, что правильным способом было бы реализовать интерфейс 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
, похоже, отсутствует в Dictionary
(поскольку он не скомпилировать), но он находится в IDictionary
, и каким-то образом компилятор правильно находит его реализацию. Вопрос 3: Что происходит?
Обратите внимание, что документация Microsoft для Dictionary
не определяет эти три метода.
Наконец, в моей реальной реализации , В итоге я использовал
IDictionary _backingDictionary = new Dictionary();
вместо
Dictionary _backingDictionary = new Dictionary();
, так что все три метода могли легко работать.