C#对象初始值设定想要使用错误的Add方法

我有以下的类层次结构:

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(字符串,字符串)”集合初始值设定有一些无效参数

我怎样才能让这个使用对象初始值设定在派生类SpecificRow允许输入MyEnum 现在看来似乎应该可以看到Add的方法SpecificRow

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

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

不过,我仍然得到同样的Add错误。 我要去尝试实施IDictionary<MyEnum, string>下一步。

--------------解决方案-------------

一个集合初始化不一定看任何ICollection.Add(x)的方法。 更具体地,对于集合初始

new SpecificRow {
{ ? }
}

C#看起来随时添加方法与添加签名(?); 如果 ? 包含逗号,C#着眼于一个Add方法有多个参数。 编译器不会有KeyValuePair <​​,>的任何特殊处理的。 究其原因{ string, string }的作品,是因为你的基类的过载Add(string, string) 不是因为它有一个重载Add(KeyValuePair<string, string>)

因此,要支持你的语法

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

你需要的形式的过载

void Add(MyEnum key, string value)

这是所有有给它。

它看起来像那是因为你只执行IDictionary<string, string>以及所有与此相关的其他接口。 您Add(KeyValuePair<MyEnum, string>)方法不执行任何接口成员,它的的一员SpecificRow这恰好被命名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

鲁本的答案肯定是最好的,但如果你不想要添加Add(MyEnum key, string value)那么你也可以初始化集合,如下所示:

var result = new SpecificRow
{
new KeyValuePair<MyEnum, string>(MyEnum.Value, ""}),
new KeyValuePair<MyEnum, string>(MyEnum.OtherValue, ""})
};

分类:C# 时间:2015-03-14 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.890 (s). 10 q(s)