Метод 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();