如何解决Generic.IList <t> .this []和IList.this []之间的调用歧义?</t>

时间:2008-09-11 16:36:20

标签: .net generics interface explicit

我有一个集合实现了一个扩展IList&lt; T&gt;的接口了。和列表。

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 ......

5 个答案:

答案 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)

这是my question here

的欺骗

总而言之,如果你这样做,它就解决了这个问题:

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,所以在同一个类中使用它们是个坏主意。