У меня есть следующая иерархия классов:
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>
далее.
Инициализатор коллекции не обязательно посмотрит на любой метод 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)
, это все, что есть для этого.
Похоже, это потому, что вы реализуете только IDictionary
и все другие связанные с ним интерфейсы. Ваш метод Add (KeyValuePair
не реализует какой-либо член интерфейса, это просто еще один член класса SpecificRow
, которым оказывается named Добавьте
, поэтому он игнорируется.
Вы должны иметь возможность выполнить одно из следующих действий, в зависимости от ваших требований:
IDictionary
в дополнение к IDictionary
, включая зависимые интерфейсы ( ICollection >
и т. Д.). IDictionary
вместо IDictionary
, снова включая зависимые интерфейсы. Row
на Row
и реализуйте IDictionary
, включая зависимые интерфейсы. SpecificRow
затем реализует Row
вместо только Row
. Ответ Рубена определенно лучший, но если вы не хотите добавлять Add(MyEnum key, string value)
, то вы также можете инициализировать коллекцию следующим образом:
var result = new SpecificRow
{
new KeyValuePair<MyEnum, string>(MyEnum.Value, ""}),
new KeyValuePair<MyEnum, string>(MyEnum.OtherValue, ""})
};