ICollection与ICollection <t> - ICollection <t> .Count与ICollection.Count之间的歧义</t> </t>

时间:2009-10-12 02:42:48

标签: c# generics icollection

注意:这与this other question

类似,但不完全相同

我已经实现了IBusinessCollection接口。它来自ICollection<T>和旧的非泛型ICollection。我更喜欢只丢弃旧的ICollection,但我正在使用带有CollectionView的WPF数据绑定,它希望我实现旧的非泛型IList: - (

无论如何,接口看起来像这样:

public interface IBusinessCollection<T> : ICollection<T>, ICollection
{ }

public interface ICollection<T>
{ int Count { get; } }

public interface ICollection
{ int Count { get; } }

由于使用依赖注入,我使用它们的接口传递类型IBusinessCollection<T>的对象,具体类型而不是,所以我有这样的东西:

internal class AnonymousCollection : IBusinessCollection<string>
{ 
    public int Count { get { return 5; } }
}

public class Factory
{
    public static IBusinessCollection<string> Get()
    { return new AnonymousCollection(); }
}

当我尝试调用此代码时,出现错误,如下所示:

var counter = Factory.Get();
counter.Count; // Won't compile
// Ambiguity between 'ICollection<string>.Count' and 'ICollection.Count'

有三种方法可以进行编译,但所有这些方法都很难看。

  1. 将类强制转换为具体实现(我可能不知道)

  2. 将班级明确地投放到ICollection

  3. 将班级明确地投放到ICollection<T>

  4. 是否有第四种选择,根本不需要我施展东西?我可以对IBusinessCollection<T>

    进行必要的更改

2 个答案:

答案 0 :(得分:10)

这似乎解决了我的快速测试中的问题。

public interface IBusinessCollection<T> : ICollection<T>, ICollection
{
    new int Count { get;  }
}

答案 1 :(得分:-1)

ICollection<string> counter = Factory.Get();
counter.Count; // No longer ambiguous