与IEnumerable
vs相同IEnumerable<T>
。是疏忽吗?或者,当您没有指定使实现扩展(如 , 等)成为不可能的类型时,是否存在.Count()
问题.Where()
?
问问题
232 次
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 回答