Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么IQueryable缺少IQueryable的所有扩展方法<;T>;有_C#_.net_Linq_Iqueryable - Fatal编程技术网

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
vs
IEnumerable
相同。这是疏忽吗?或者,如果没有指定使实现扩展(如
.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
的非泛型版本,再次实现大多数方法没有明显的好处。