【问题标题】:ICollection vs ICollection<T>- Ambiguity between ICollection<T>.Count and ICollection.CountICollection 与 ICollection<T> - ICollection<T>.Count 和 ICollection.Count 之间的歧义
【发布时间】:2010-12-05 20:45:33
【问题描述】:

注意:这与this other question类似,但不完全相同

我已经实现了一个IBusinessCollection 接口。它来自ICollection&lt;T&gt; 和旧的非通用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&lt;T&gt; 类型的对象,不是具体类型,所以我有这样的东西:

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'

有 3 种方法可以编译,但都很难看。

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

  2. 将类显式转换为ICollection

  3. 将类显式转换为ICollection&lt;T&gt;

是否有第四个选项根本不需要我施放东西?我可以对IBusinessCollection&lt;T&gt;进行任何我需要的更改@

【问题讨论】:

  • 为什么不显式地实现这两个接口,直接实现通用接口呢?它仍然可以从外部“针对接口进行编程,而不是针对实现进行编程”。

标签: c# generics icollection


【解决方案1】:
ICollection<string> counter = Factory.Get();
counter.Count; // No longer ambiguous

【讨论】:

  • 我认为这并不能真正解决问题。在我的示例代码中,我得到了 var 或显式 IBusinessCollection&lt;string&gt; 类型的歧义错误。
  • 该问题要求第四个选项。他已经知道这种可能性。
  • 我仍然得到模棱两可的错误。
  • @John:他当然可以。他知道他收到了IBusinessObject&lt;string&gt;。该接口实现ICollection&lt;string&gt;。与流行的看法相反,var 是 not 变体!它是一种静态类型,在这种情况下在编译时被解析为IBusinessCollection&lt;string&gt;,它在两个具有相同名称的单独子接口中定义了两个属性。如果可能,使用其中一种可以消除歧义。
  • 我不想强制转换或必须明确说明类型。我只想使用 var 并拥有干净的代码。就这一点而言,ICollection counter 与 var counter = (ICollection) 相同,并不能解决问题
【解决方案2】:

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

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

【讨论】:

  • 附言。不知道你可以在界面中做“新”。很好:-)
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多