簡體   English   中英

為什么IQueryable缺少IQueryable <T>具有的所有擴展方法?

[英]Why is IQueryable lacking all the extension methods that IQueryable<T> has?

IEnumerable vs IEnumerable<T> 這是疏忽嗎? 或者是有,當你沒有指定類型,使得實現擴展的問題等.Count() .Where()等是不可能的?

來自文檔

IQueryable接口旨在由查詢提供程序實現。 它只應由實現IQueryable<T>提供者實現。 如果提供程序也未實現IQueryable<T> ,則不能在提供程序的數據源上使用標准查詢運算符。

IEnumerable是.NET沒有泛型的時代的神器(我當然不是說它已被棄用)。 它一直是為了向后兼容,在泛型之后,因此引入了IEnumerable<T> IQueryable始終如一地保持一致性。 基本上,鑒於現在存在泛型,並且鑒於其優點,它使得僅在通用接口上實現這些擴展變得有用。 使用Cast<T>可以始終將非泛型的轉換為通用的

不,這不是疏忽。 大多數擴展IQueryable<T>IEnumerable<T>需要知道項的類型。 顯然,像Count()Any()可以在非泛型接口上工作,但它可能會讓人感到困惑。 因此,適用於非泛型接口的唯一方法是使它們通用的方法( Cast<T>()OfType<T>() )。

這可能是一個深思熟慮的決定而不是疏忽,因為IEnumerable\\IQueryable總是可以使用Cast方法轉換為IEnumerable\\IQueryable<object>

這為調用者帶來了很小的開銷,但是可以節省兩次實現的擴展,例如, Where需要通用和非通用版本的地方:

public static IEnumerable Where(this IEnumerable source, Func<object, bool> predicate) { ... }
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM