在BindingList <t>中找不到Select()方法,包括System.Linq </t>

时间:2013-11-22 15:04:33

标签: c# linq bindinglist

我有以下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'的定义

我错过了什么?

3 个答案:

答案 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的调用是无用的,因为你实际上并没有改变输入。您还可以将WhereFirstOrDefault合并为一个电话。

   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();