5

我有以下类层次结构:

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, ""}
    };

我收到此错误:

集合初始值设定项的最佳重载 Add 方法 'Row.Add(string, string)' 有一些无效参数

我怎样才能使它在派生类上使用对象初始值设定项SpecificRow允许 type MyEnum?似乎它应该AddSpecificRow.

更新: 我实现了一个额外的接口,SpecificRow所以它现在看起来像这样:

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

但是,我仍然遇到同样的Add错误。接下来我将尝试实施IDictionary<MyEnum, string>

4

3 回答 3

7

集合初始值设定项不一定会查看任何 ICollection.Add(x) 方法。更具体地说,对于集合初始化器

new SpecificRow {
    { ? }
}

C# 查看带有签名 Add(?); 的任何 Add 方法;如果 ?包含逗号,C# 使用多个参数查看 Add 方法。编译器根本没有对 KeyValuePair<,> 进行任何特殊处理。原因{ string, string }有效,是因为您的基类有一个重载Add(string, string),而不是因为它有一个重载 for Add(KeyValuePair<string, string>)

所以为了支持你的语法

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

你需要表单的重载

void Add(MyEnum key, string value)

这里的所有都是它的。

于 2010-02-01T21:19:25.090 回答
5

看起来这是因为您只实现IDictionary<string, string>,以及与之关联的所有其他接口。您的Add(KeyValuePair<MyEnum, string>)方法没有实现任何接口成员,它只是SpecificRow该类的另一个成员,恰好是 named Add,这就是它被忽略的原因。

您应该能够执行以下操作之一,具体取决于您的要求:

  1. 实现IDictionary<MyEnum, string>除 外IDictionary<MyEnum, string>,包括依赖接口(ICollection<KeyValuePair<MyEnum, string>>等)。
  2. 实现IDictionary<MyEnum, string>而不是IDictionary<MyEnum, string>,再次包括依赖接口。
  3. 将声明更改RowRow<T>,并实现IDictionary<T, string>,包括依赖接口。SpecificRow然后将实施Row<MyEnum>而不仅仅是Row.
于 2010-02-01T20:57:00.530 回答
1

鲁本的回答绝对是最好的,但如果你不想添加,Add(MyEnum key, string value)那么你也可以像这样初始化集合:

var result = new SpecificRow
{
    new KeyValuePair<MyEnum, string>(MyEnum.Value, ""}),
    new KeyValuePair<MyEnum, string>(MyEnum.OtherValue, ""})
};
于 2010-02-01T22:23:11.493 回答