2

一个类继承自 HashSet 以获取一组具有自定义EqualKeys(T x, T y)检查的唯一对象,而不是IEqualityComparer.

public class UniqueSet<T> : HashSet<T> where T : IKey
{
    public new void Add(T item)
    {
         // .. check item for null, empty key etc.

          if (base.Any(t => UniqueSet<T>.EqualKeys(t, item)))
          {
             throw new ArgumentException(..);
          }
          if (!base.Add(item)) throw new ArgumentException(..);
     }

    private static bool EqualKeys(T x, T y) 
    {
       return ((IKey)x).Key.Equals(((IKey)y).Key, StringComparison.CurrentCultureIgnoreCase);
    }
}

代码无法编译,因为我必须替换base.Anythis.Any.
恐怕我不明白这是为什么?

4

2 回答 2

13

“任何”是一种扩展方法,而不是一种方法HashSet<T>。它在基类型上不存在,因此您不能在基类型上显式调用它。当您使用“this.Any”调用它时,重载解析代码无法在“this”类型上找到“Any”,因此它开始寻找扩展方法并找到一个。

不是你的问题,但我还是会提到它:如果你添加到已经有这样一个元素的集合中,为什么要抛出?为什么不让它成为一个无操作的这样做呢?通过抛出,您要求 Add 的调用者知道元素是否已经在集合中,这似乎是一个繁重的要求。

于 2010-10-01T15:34:20.423 回答
1

因为HashSet<T>没有实现Any()Any()是 的扩展方法IEnumerable<T>。当你使用 base 时,你是在显式引用基类型而不是它的扩展方法。

于 2010-10-01T15:35:48.290 回答