Инициализатор объекта C#, желающий использовать неправильно, Добавляет метод

У меня есть следующая иерархия классов:

public class Row : ICloneable, IComparable, IEquatable<Row>,
    IStringIndexable, IDictionary<string, string>,
    ICollection<KeyValuePair<string, string>>,
    IEnumerable<KeyValuePair<string, string>>,
    System.Collections.IEnumerable
{ }

public class SpecificRow : Row, IXmlSerializable,
    System.Collections.IEnumerable
{
    public void Add(KeyValuePair<MyEnum, string> item) { }
}

Однако пытаясь сделать следующее дает ошибку:

var result = new SpecificRow
    {
        {MyEnum.Value, ""},
        {MyEnum.OtherValue, ""}
    };

Я получаю эту ошибку:

Перегруженные лучшие Добавляют метод 'строка. Добавьте (строка, строка)' для инициализатора набора имеет некоторые недействительные аргументы

Как я могу сделать его так, чтобы с помощью объектного инициализатора на производном классе SpecificRow позволяет тип MyEnum? Кажется, что это должно видеть Add метод в SpecificRow.

Обновление: Я реализовал дополнительный интерфейс на SpecificRow таким образом, это теперь похоже на это:

public class SpecificRow : Row, IXmlSerializable,
    System.Collections.IEnumerable,
    ICollection<KeyValuePair<MyEnum, string>>
{ }

Однако я все еще получаю то же Add ошибка. Я собираюсь попытаться реализовать IDictionary<MyEnum, string> далее.

5
задан Sarah Vessels 1 February 2010 в 21:24
поделиться

3 ответа

Инициализатор коллекции не обязательно посмотрит на любой метод iconcept.add (x). Более конкретно, для инициализатора коллекции

new SpecificRow {
    { ? }
}

C # смотрит на любой способ добавления с помощью подписи Add (?); если ? Содержит запятыми, C # смотрит на добавочный метод с несколькими аргументами . Компилятор не имеет особого обращения с KeyValuePair <,> вообще. Причина {String, String} работает, заключается в том, что ваш базовый класс имеет перегрузку Add (String, String) , а не , потому что он имеет перегрузку для Добавить (keyvaluepair ) .

Так что для поддержки вашего синтаксиса для

new SpecificRow {
    { MyEnum.Value, "" }
};

вам нужна перегрузка формы

void Add(MyEnum key, string value)

, это все, что есть для этого.

7
ответ дан 18 December 2019 в 14:46
поделиться

Похоже, это потому, что вы реализуете только IDictionary и все другие связанные с ним интерфейсы. Ваш метод Add (KeyValuePair ) не реализует какой-либо член интерфейса, это просто еще один член класса SpecificRow , которым оказывается named Добавьте , поэтому он игнорируется.

Вы должны иметь возможность выполнить одно из следующих действий, в зависимости от ваших требований:

  1. Реализовать IDictionary в дополнение к IDictionary , включая зависимые интерфейсы ( ICollection > и т. Д.).
  2. Реализуйте IDictionary вместо IDictionary , снова включая зависимые интерфейсы.
  3. Измените объявление Row на Row и реализуйте IDictionary , включая зависимые интерфейсы. SpecificRow затем реализует Row вместо только Row .
5
ответ дан 18 December 2019 в 14:46
поделиться

Ответ Рубена определенно лучший, но если вы не хотите добавлять Add(MyEnum key, string value), то вы также можете инициализировать коллекцию следующим образом:

var result = new SpecificRow
{
    new KeyValuePair<MyEnum, string>(MyEnum.Value, ""}),
    new KeyValuePair<MyEnum, string>(MyEnum.OtherValue, ""})
};
1
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: