2016-02-12 47 views
1

我有一個類,並有一個列表,這個班,我想補充一個Where功能上我的課調用列表的Where功能,事情是這樣的:添加功能上我的課

public class MyClass<T> where T : class 
{  
    public Func<T, IEnumerable<T>> Where{ get; set; } 
    public List<T> mylist = new List<T>(); 
    public MyClass() 
    { 
     Where = mylist.Where; 
    } 
} 

,我發現了錯誤:

No overload for 'Where' matches delegate 'Func<T, IEnumerable<T>> 
+0

能否請你解釋它是如何是你打算使用你的'Where'屬性? – Enigmativity

回答

2

您的委託類型錯誤,應該是:

public Func<Func<T, bool>, IEnumerable<T>> Where { get; set; } 
2

根據IEnumerable on MSDNIEnumerable<TSource> Where<TSource>(Func<TSource, Boolean>)IEnumerable<TSource> Where<TSource>(Func<TSource, Int32, Boolean>)

這些可澆鑄到Func<Func<TSource, Boolean>, IEnumerable<TSource>>Func<Func<TSource, Int32, Boolean>, IEnumerable<TSource>>尊重。

既不匹配您的屬性「Where」聲明的類型,即Func<T, IEnumerable<T>>,這就是編譯器告訴您No overload for 'Where' matches delegate 'Func<T, IEnumerable<T>>的原因。

您需要選擇適當的委託類型。

0

List<T>沒有提供Where-功能。 Where是枚舉類型的擴展函數,請參閱MSDN。請參閱其他答案,瞭解如何糾正屬性以匹配擴展功能的類型。

當然,我不知道你想才達到的東西,但如果你想有一個分配過濾器列表類,你可以使用這樣的事情:

public class MyClass<T> : IEnumerable<T> where T : class { 

    public Func<T, bool> Filter { get; set; } 
     = T => true; // default: no filter 

    public List<T> mylist = new List<T>(); 

    public IEnumerator<T> GetEnumerator() 
     => mylist.Where(Filter).GetEnumerator(); 

    IEnumerator IEnumerable.GetEnumerator() 
     => mylist.Where(Filter).GetEnumerator(); 
}