C# 既然Dbset已经实现了IQueryable,为什么还要实现IEnumerable?

C# 既然Dbset已经实现了IQueryable,为什么还要实现IEnumerable?,c#,ienumerable,iqueryable,dbset,C#,Ienumerable,Iqueryable,Dbset,Dbset似乎在已经有IQueryable的情况下实现了IEnumerable,这是否使得IEnum的实现变得多余,因为IQueryable已经实现了IEnum。有时您需要特定表的所有行,而不需要任何附加的where子句,格式为IEnumerable。在这些情况下,您可以直接将DbSet强制转换为IEnumerable首先,我们应该更正您的术语: IQueryable已经实现了IEnum IQueryable没有实现任何功能。它继承了IEnum,这意味着实现IQueryable的每个类都必须实现

Dbset似乎在已经有IQueryable的情况下实现了IEnumerable,这是否使得IEnum的实现变得多余,因为IQueryable已经实现了IEnum。

有时您需要特定表的所有行,而不需要任何附加的
where
子句,格式为
IEnumerable
。在这些情况下,您可以直接将
DbSet
强制转换为
IEnumerable

首先,我们应该更正您的术语:

IQueryable已经实现了IEnum

IQueryable
没有实现任何功能。它继承了
IEnum
,这意味着实现
IQueryable
的每个类都必须实现
IEnum
的成员以及
IQueryable
的成员

我认为你的问题实际上是这样的:
DbSet
为什么被定义为实现
IEnum
,当它实现
IQueryable
时,它就必须实现
IEnum

从技术上讲,声明
DbSet
实现
IEnum
是多余的

这就留下了一个问题,为什么会有人不必要地声明一个基本接口

我将引用Eric Lippert的这篇博客文章:

也许是因为他们相信这样做会使代码更容易理解,更易于自我记录

或者,也许开发人员编写的代码是

接口I1{}

接口I2{}

接口I3:I1,I2{}

然后意识到,哦,等等,I2应该从I1继承。为什么进行编辑需要开发人员返回并更改I3的声明,使其不包含对I1的明确提及?我认为没有理由强迫开发人员删除冗余信息


Eric Lippert在这篇博文中回答了这个问题:对不起,可能是重复的,但你的答案是错误的。您可以直接将
DbSet
转换为
IEnumerable
,无论它是显式实现
IEnumerable
,还是隐式实现
IEnumerable
,因为显式实现在层次结构的更上层。看看这个DotNetFiddle,了解我的意思: