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

Ori*_*rds 6 c# generics icollection

注意:这与其他问题类似,但不完全相同

我已经实现了一个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; } }
Run Code Online (Sandbox Code Playgroud)

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

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

public class Factory
{
    public static IBusinessCollection<string> Get()
    { return new AnonymousCollection(); }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 把课程转化为它的具体实现(我可能不知道)

  2. 明确地将类强制转换为 ICollection

  3. 明确地将类强制转换为 ICollection<T>

是否有第四种选择,根本不需要我施展东西?我可以做出我需要做的任何改变IBusinessCollection<T>

Joh*_*her 10

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

public interface IBusinessCollection<T> : ICollection<T>, ICollection
{
    new int Count { get;  }
}
Run Code Online (Sandbox Code Playgroud)