4

IEnumerablevs相同IEnumerable<T>。是疏忽吗?或者,当您没有指定使实现扩展(如 , 等)成为不可能的类型时,是否存在.Count()问题.Where()

4

3 回答 3

4

文档

IQueryable 接口旨在由查询提供者实现。它只应该由实现IQueryable<T>. 如果提供者也没有实现IQueryable<T>,则不能在提供者的数据源上使用标准查询运算符。

IEnumerable是.NET 没有泛型的时代的产物(当然,我并不是说它已被弃用)。在泛型之后,它一直存在于向后兼容,因此IEnumerable<T>被引入。IQueryable保持一致以保持一致。基本上,鉴于现在有泛型,并且鉴于其优势,仅在泛型接口上实现这些扩展是有用的。非通用的总是可以使用转换为通用的Cast<T>

于 2013-07-10T19:39:46.333 回答
1

不,这不是疏忽。大多数扩展方法需要知道项目的类型IQueryable<T>IEnumerable<T>显然,类似Count()Any()可以在非泛型接口上工作的方法,但它可能会令人困惑。因此,适用于非泛型接口的唯一方法是使它们成为泛型(Cast<T>()OfType<T>())的方法。

于 2013-07-10T19:40:59.713 回答
0

这可能是一个深思熟虑的决定,而不是疏忽,因为 anIEnumerable\IQueryable总是可以转换为IEnumerable\IQueryable<object>使用该Cast方法的。

这为调用者引入了少量开销,但节省了两次实现许多扩展,例如,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) { ... }
于 2013-07-10T19:39:53.397 回答