我有以下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'不包含 'Where'的定义
我错过了什么?
答案 0 :(得分:4)
问题在于您调用扩展方法的方式。您只需使用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
本身并不是表达式。话虽如此,我相信C#规范的第7.6.8节与此不一致。我会向C#团队提出这一点。)
编译好:
public T GetRecord(T obj)
{
return this.Where(t => t.Equals(obj))
.Select(t => t).FirstOrDefault();
}
(我在方法中添加了一个返回类型 - 请在将来提问时要更加小心,考虑到你在这个问题中出现的错误数量。)
答案 1 :(得分:3)
选择接受Func<TSource, TResult>
,但您传递的是t
,这是一个未声明的符号......应该是
Select(t => t)
此外,您应该使用this
代替base
。
无论如何,对Select
的调用是无用的,因为你实际上并没有改变输入。您还可以将Where
和FirstOrDefault
合并为一个电话。
public T GetRecord(T obj)
{
return this.FirstOrDefault(t => t.Equals(obj));
}
答案 2 :(得分:1)
尝试从列表
转换实例return base.Cast<T>().Where(t => t.Equals(obj)).Select(t).FirstOrDefault();