C# 为什么IQueryable缺少IQueryable的所有扩展方法<;T>;有
与C# 为什么IQueryable缺少IQueryable的所有扩展方法<;T>;有,c#,.net,linq,iqueryable,C#,.net,Linq,Iqueryable,与IEnumerablevsIEnumerable相同。这是疏忽吗?或者,如果没有指定使实现扩展(如.Count()、.Where())等变得不可能的类型,是否存在问题?来自: IQueryable接口旨在由查询提供程序实现。它只应该由也实现IQueryable的提供者实现。如果提供程序未实现IQueryable,则无法在提供程序的数据源上使用标准查询运算符 IEnumerable是.NET没有泛型的时代的产物(当然,我并不是说它不受欢迎)。在引入泛型之后,它一直保持向后兼容性,因此引入了IEn
IEnumerable
vsIEnumerable
相同。这是疏忽吗?或者,如果没有指定使实现扩展(如.Count()
、.Where()
)等变得不可能的类型,是否存在问题?来自:
IQueryable接口旨在由查询提供程序实现。它只应该由也实现IQueryable
的提供者实现。如果提供程序未实现IQueryable
,则无法在提供程序的数据源上使用标准查询运算符
IEnumerable
是.NET没有泛型的时代的产物(当然,我并不是说它不受欢迎)。在引入泛型之后,它一直保持向后兼容性,因此引入了IEnumerable
<代码>IQueryable保持一致性。基本上,考虑到现在有泛型,并且考虑到它的优点,只在泛型接口上实现这些扩展是很有用的。使用Cast
始终可以将非泛型转换为泛型。这可能是一个深思熟虑的决定,而不是一个疏忽,因为IEnumerable\IQueryable
始终可以使用Cast
方法将其转换为IEnumerable\IQueryable
这为调用者带来了较小的开销,但节省了两次实现许多扩展的时间,例如,对于其中您需要通用和非通用版本:
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) { ... }
公共静态IEnumerable其中(此IEnumerable源,Func谓词){…}
公共静态IEnumerable其中(此IEnumerable源,Func谓词){…}
不,这不是疏忽。大多数扩展IQueryable
和IEnumerable
的方法都需要知道项目的类型。显然,像Count()
或Any()
这样的方法可以在非泛型接口上工作,但可能会造成混淆。因此,应用于非泛型接口的唯一方法是使其成为泛型的方法(Cast()
和OfType()
)。会有一个好处-您不必首先调用Cast
:)@MarcinJuraszek-这对用户来说是一个小好处,但是额外的实现成本并不能证明这么小的开销是合理的。额外的实现成本是多少?这只是方法声明中的(此IEnumerable源代码)
或(此IEnumerable源代码)
的问题。我很确定这样做还有另一个原因。不,你不会的。因为继承不需要直接类型知识的IEnumerable
方法(例如Count()
,Any()
)可以在IEnumerable
上实现,其余的方法(如Where(pred)
,Select(func)
等)在IEnumerable
@BlueRaja DannyPflughoeft上,必须有人来实现它们,对他们来说,这样做是有成本的。问题在于IEnumerable
上缺少linq扩展是否是一种疏忽。我是说,这可能是经过深思熟虑的,因为对于IEnumerable\IQueryable
的非泛型版本,再次实现大多数方法没有明显的好处。