При использовании base.Any (..) предупреждение: «HashSet» не содержит определения «Any» - PullRequest
2 голосов
/ 01 октября 2010

Класс наследуется от 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.Anyс this.Any.
Боюсь, я не понимаю, почему это так?

Ответы [ 2 ]

13 голосов
/ 01 октября 2010

«Любой» - это метод расширения , а не метод HashSet<T>. Он не существует для базового типа, поэтому вы не можете вызвать его явно для базового типа. Когда вы вызываете его с помощью this.Any, код разрешения перегрузки не может найти «Any» для типа «this», поэтому он начинает поиск методов расширения и находит один.

Не ваш вопрос, но я все равно упомяну его: зачем throw , если вы добавляете в набор, который уже имеет такой элемент? Почему бы просто не запретить это? Выдавая, вы делаете обязательным для вызывающей стороны Add знать, находится ли элемент в наборе уже или нет, что кажется обременительным требованием.

1 голос
/ 01 октября 2010

Потому что HashSet<T> не реализует Any(). Any() - это метод расширения от IEnumerable<T>. Когда вы используете base, вы явно ссылаетесь на базовый тип, а не на методы его расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...