7

我有一个集合,它实现了一个扩展 IList<T> 和 List 的接口。

public Interface IMySpecialCollection : IList<MyObject>, IList { ... }

这意味着我有两个版本的索引器。

我希望使用通用实现,所以我通常实现它:

public MyObject this[int index] { .... }

我只需要 IList 版本进行序列化,所以我明确地实现它,以保持它隐藏:

object IList.this[int index] { ... }

但是,在我的单元测试中,以下

MyObject foo = target[0];

导致编译器错误

以下方法或属性之间的调用不明确

我对此有点惊讶;我相信我以前做过,而且效果很好。我在这里想念什么?如何让 IList<T> 和 IList 在同一个接口中共存?

编辑IList<T>没有实现 IList,我必须实现 IList 进行序列化。我对解决方法不感兴趣,我想知道我缺少什么。

再次编辑:我不得不从界面中删除 IList 并将其移动到我的班级。我不想这样做,因为实现接口的类最终会被序列化为 Xaml,这需要集合来实现 IDictionary 或 IList...

4

5 回答 5

3

你不能这样做

public interface IMySpecialCollection : IList<MyObject>, IList { ... }

但是你可以用一个类做你想做的事,你需要明确地实现其中一个接口。在我的示例中,我明确表示了 IList。

public class MySpecialCollection : IList<MyObject>, IList { ... }

IList<object> myspecialcollection = new MySpecialCollection(); IList list = (IList)myspecialcollection;

您是否考虑过让 IMySpecialCollection 实现 ISerializable 进行序列化?支持多种集合类型对我来说似乎有点不对劲。您可能还想查看将您的 IList 转换为 IEnumerable 以进行序列化,因为 IList 只是包装了 IEnumerable 和 ICollection。

于 2008-09-11T17:41:12.837 回答
2

这是我的问题的欺骗

总而言之,如果你这样做,它可以解决问题:

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}
于 2009-11-03T20:25:24.887 回答
1

不幸的是,您不能使用相同的参数列表声明两个索引器。以下段落摘自此处C# Programming Guide - Using Indexers "Remarks" 部分

索引器的签名由其形式参数的数量和类型组成。它不包括索引器类型或形式参数的名称。如果您在同一类中声明多个索引器,则它们必须具有不同的签名。

如果您希望使用第二个索引器,则必须声明一组不同的参数。

于 2008-09-11T16:53:18.817 回答
-1

将您的通用实现更改为...

T IList<T>.this[int index] { get; set; }

这明确说明了哪个“这个”是哪个。

于 2008-09-11T17:00:40.670 回答
-2

List<T> 隐含 IList,因此在同一个类中使用两者是个坏主意。

于 2008-09-11T16:44:51.583 回答