IQueryable vs IEnumerable 和对象知道它是哪个子类的多态性

IQueryable vs IEnumerable and polymorphism where an object knows which subclass it is

当使用 IEnumerable 显式声明查询类型时,例如

IEnumerable<string> q = 
    from c in db.Customers      
    select c.ContactName;   
var q2 = q.Where(s => s.StartsWith(start)); 
return q2;

查询将使用 Enumerable.where。为什么查询不知道是IQueryable而使用Queryable.where

这似乎与 OOP 概念相矛盾,在 OOP 概念中,用父类型声明的子对象应该知道它实际上是子类型并使用子类型的方法。

IEnumerable<T> 上的 .Where 方法是 extension method

因此,它不能虚拟。只有虚拟方法表现出您所期望的多态性