Метод Select() не найден в BindingList<T>, System.Linq включен

У меня есть следующий производный класс BindingList.

class MyBindingList<T> : BindingList<T> where T: class
{
  public T GetRecord(T obj)
   {
      return base.Where(t => t.Equals(obj)) //Where and Select not found on base :(
             .Select(t => t).FirstOrDefault();
   }
}

Компилятор выдает мне следующую ошибку

Ошибка CS0117: "System.ComponentModel.BindingList" не содержит определения "где"

Что мне не хватает?

3 ответа

Решение

Проблема в том, как вы вызываете метод расширения. Вам просто нужно использовать this вместо base, Вызов методов расширения на this относительно необычно, но нужно this явно... и это не может быть baseЭто означает, что вы пытаетесь вызвать метод, объявленный одним из предков в иерархии типов. Вызов метода с использованием base не проходит проверки вызова метода расширения. Из спецификации C# 5, раздел 7.6.5.2:

В вызове метода (§7.5.5.1) одной из форм

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

если обычная обработка вызова не находит применимых методов, делается попытка обработать конструкцию как вызов метода расширения.

Это не так в вашем коде. (base не является выражением само по себе. Сказав это, я считаю, что раздел 7.6.8 спецификации C# несовместим с этим. Я подниму это с командой C#.)

Это хорошо компилируется:

public T GetRecord(T obj)
{
    return this.Where(t => t.Equals(obj))
               .Select(t => t).FirstOrDefault();
}

(Я добавил тип возврата к методу - будьте внимательны, задавая вопросы в будущем, учитывая количество ошибок, которые, по-видимому, были у вас в этой.)

Выберите принимает Func<TSource, TResult>, но вы проходите мимо t, который является необъявленным символом... это должно быть

Select(t => t)

Кроме того, вы должны использовать this вместо base,

Во всяком случае, звонок в Select бесполезно, так как вы на самом деле не преобразовываете ввод. Вы также можете объединить Where а также FirstOrDefault в один звонок.

   public T GetRecord(T obj)
   {
      return this.FirstOrDefault(t => t.Equals(obj));
   }

Попробуй разыграть свои экземпляры из списка

return base.Cast<T>().Where(t => t.Equals(obj)).Select(t).FirstOrDefault();
Другие вопросы по тегам