2013-11-22 47 views
2

我有以下BindingList派生類。在BindingList中找不到Select()方法<T>,包含System.Linq

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

編譯器是給我下面的錯誤

error CS0117: 'System.ComponentModel.BindingList' does not contain a definition for 'Where'

我缺少什麼?

回答

4

問題是你調用擴展方法的方式。您只需使用this而不是base。在this上調用擴展方法相對不常見,但明確需要this ...並且它不能是base,這表明您正嘗試調用在類型層次結構中的祖先之一中聲明的方法。使用base的方法調用不經過擴展方法調用檢查。從C#5規範開始,第7.6.5.2節:

In a method invocation (§7.5.5.1) of one of the forms

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

if the normal processing of the invocation finds no applicable methods, an attempt is made to process the construct as an extension method invocation.

在代碼中情況並非如此。 (base本身並不是一個表達式話雖如此,我相信C#規範第7.6.8與此不一致,我會提高,與C#團隊。)

這種精細編譯:

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

(我加了一個返回類型的方法 - ,要求在未來的問題時要更加小心給它看來你這個人有失誤的數量)

+0

解決了這個問題。爲什麼基地不會有它? – fahadash

+0

雖然這使它編譯,你能解釋一下,爲什麼它有所作爲?由於綁定列表實現IEnumerable ,因此應該可以在其上使用Where擴展方法。 – okrumnow

+0

@jonskeet謝謝! – fahadash

1

嘗試投你的情況下,從列表

return base.Cast<T>().Where(t => t.Equals(obj)).Select(t).FirstOrDefault(); 
+0

錯誤CS0117「System.ComponentModel .BindingList '不包含'Cast'的定義 – fahadash

+0

您應該dd使用System.Linq;到您使用的部分 –

3

選擇接受Func<TSource, TResult>,但你傳遞t,這是一個未聲明符號...應該是

Select(t => t) 

而且,你應該使用this而不是base

無論如何,Select的呼叫是無用的,因爲你實際上並沒有改變輸入。您還可以將WhereFirstOrDefault合併成一個呼叫。

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

我的問題有錯誤,我修正了這些錯誤。我仍然收到編譯器錯誤。如果你喜歡,我可以分享示例代碼。 – fahadash

+0

@fahadash,看我更新的答案 –

相關問題