与IEnumerable
vs IEnumerable<T>
相同。这是疏忽吗?或者,如果您没有指定类型来实现.Count()
,.Where()
等实现扩展,那么会出现问题吗?
答案 0 :(得分:4)
来自docs:
IQueryable接口旨在供查询提供程序实现。它只应由也实施
IQueryable<T>
的提供商实施。如果提供程序也未实现IQueryable<T>
,则不能在提供程序的数据源上使用标准查询运算符。
IEnumerable
是.NET没有泛型的时代的工件(我当然不是说它已被弃用)。为了向后兼容,它一直存在于泛型之后,因此引入了IEnumerable<T>
。 IQueryable
跟上这一点以保持一致性。基本上,鉴于现在存在泛型,并且鉴于其优点,它使得仅在通用接口上实现这些扩展变得有用。可以使用Cast<T>
答案 1 :(得分:1)
不,这不是疏忽。扩展IQueryable<T>
和IEnumerable<T>
的大多数方法都需要知道项目的类型。显然,像Count()
或Any()
这样的方法可以在非泛型接口上工作,但它可能会让人感到困惑。因此,适用于非泛型接口的唯一方法是使它们成为通用接口的方法(Cast<T>()
和OfType<T>()
)。
答案 2 :(得分:0)
这可能是一个深思熟虑的决定而不是疏忽,因为IEnumerable\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) { ... }