我有一个集合实现了一个扩展IList< T>的接口了。和列表。
public Interface IMySpecialCollection : IList<MyObject>, IList { ... }
这意味着我有两个版本的索引器。
我希望使用通用实现,所以我通常会实现它:
public MyObject this[int index] { .... }
我只需要IList版本进行序列化,所以我明确地实现了它,以保持隐藏:
object IList.this[int index] { ... }
但是,在我的单元测试中,以下
MyObject foo = target[0];
导致编译器错误
电话之间的暧昧不明确 以下方法或属性
我对此感到有些惊讶;我相信我以前做过它并且工作正常。我在这里错过了什么?我怎样才能得到IList&lt; T&gt;和IList在同一个界面中共存?
修改 IList&lt; T&gt; 不实现IList,我必须实现IList进行序列化。我对解决方法不感兴趣,我想知道我错过了什么。
再次编辑:我不得不从界面中删除IList并将其移到我的课堂上。我不想这样做,因为实现接口的类最终会被序列化为Xaml,这需要集合来实现IDictionary或IList ......
答案 0 :(得分: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进行序列化? 支持多种集合类型对我来说似乎有点不对劲。您可能还想看看将ILI转换为IEnumerable以进行序列化,因为IList只包装了IEnumerable和ICollection。
答案 1 :(得分:2)
总而言之,如果你这样做,它就解决了这个问题:
public Interface IMySpecialCollection : IList<MyObject>, IList
{
new MyObject this[int index];
...
}
答案 2 :(得分:1)
不幸的是,您无法使用相同的参数列表声明两个索引器。以下段落取自C# Programming Guide - Using Indexers "Remarks" section:
索引器的签名由其形式参数的数量和类型组成。它不包括索引器类型或形式参数的名称。如果在同一个类中声明多个索引器,则它们必须具有不同的签名。
如果您希望使用第二个索引器,则必须声明一组不同的参数。
答案 3 :(得分:-1)
将您的通用实施更改为...
T IList<T>.this[int index] { get; set; }
这明确说明哪个'这个'是哪个。
答案 4 :(得分:-2)
列表与LT; T&GT;意味着IList,所以在同一个类中使用它们是个坏主意。