Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 为什么Enumerable不从IEnumerable继承_C#_Linq_Ienumerable_Enumerable - Fatal编程技术网

C# 为什么Enumerable不从IEnumerable继承

C# 为什么Enumerable不从IEnumerable继承,c#,linq,ienumerable,enumerable,C#,Linq,Ienumerable,Enumerable,我对这个问题非常困惑,无法理解。在可列举的文档中,我阅读了以下内容: 实现System.Collections.Generic.IEnumerable的 还有一些方法,如Select return IEnumerable,我们可以在使用该方法后从其他方法(如Where)中使用。例如: names.Select(name => name).Where(name => name.Length > 3 ); 但Enumerable不从IEnumerable继承,并且IEnumera

我对这个问题非常困惑,无法理解。在可列举的文档中,我阅读了以下内容:

实现System.Collections.Generic.IEnumerable的

还有一些方法,如Select return IEnumerable,我们可以在使用该方法后从其他方法(如Where)中使用。例如:

names.Select(name => name).Where(name => name.Length > 3 );
但Enumerable不从IEnumerable继承,并且IEnumerable也不包含Select、Where等

我错了吗? 或者存在任何原因?

选择、位置等。它们需要在别处定义,因为接口不能提供方法的实现

您可以通过参数列表中的关键字this来识别扩展方法。例如:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

可以将其用作IEnumerable上的一个方法,只有一个参数:Func谓词。

我说过你也阅读了Jon Skeet的这篇文章,以获得进一步的见解。

正确。但是这句话呢

实现System.Collections.Generic.IEnumerable的

根据这句话,我们必须在IEnumerable接口中定义方法,并通过继承在Enumerable类中实现。正确吗


为什么首选扩展方法反对继承?

IEnumerable出现在IEnumerable之前,IEnumerable是一个2.0+接口。

为什么首选扩展方法反对继承


Enumerable是一个静态类,它实现了IEnumerable的50多个扩展方法。这使您可以在实现IEnumerable的类型上使用所有这些扩展方法,而无需强制程序员为每个集合类型实现所有这些方法。如果Enumerable是一个接口而不是一个静态类,则每个集合类型(如List、Dictionary、Set等)都有自己的这些扩展方法的实现。

解决此问题的方法是使用Cast方法将元素强制转换为其相同的类型,该方法返回相同元素的IEnumerable版本

DataTable dt = ...
dt.Rows.Cast<DataRow>().Where()...

行的类型为IEnumerable,强制转换后它将变为IEnumerable类型,这是由LINQ扩展方法支持的。

这是关于扩展方法的,而不是关于迭代器块,您应该添加注释或编辑问题,而不是创建新答案来添加新信息或问题。