【发布时间】:2021-03-04 22:38:09
【问题描述】:
我看到了像 DBSet 这样的类型,它可以同时实现 IQueryable 和 IEnumerable,如下所示:
public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IEnumerable, IQueryable, ...
显然 IQueryable 继承了 IEnumerable,并且在 System.Linq 命名空间中,Enumerable 静态类和 IQueryable 静态类都为 IQueryable 和 IEnumerable 定义了一些扩展方法运算符,如 First()、Select(),
我想知道一些类似的调用
DBSet<Student> studs = dbContext.Students;
var stu = studs.First();
显然是调用了IQueryable静态类中的public static TSource First<TSource>(this IQueryable<TSource> source);方法。
来自 C# 规范(7.6.5.2),它说:
如果在给定的命名空间或编译单元中使用命名空间指令导入的命名空间直接包含具有合格扩展方法 Mj 的非泛型类型声明 Ci,那么这些扩展方法的集合就是候选集。
但就我而言,System.Linq 命名空间中的 Enumerable 和 IQueryable 类,我想知道在这种情况下,public static T First<T>(this IQueryable<T> source) 是如何被决定和调用的?
【问题讨论】:
标签: c# interface linq-to-sql extension-methods