IQueryable vs IEnumerable 和多态,其中一个对象知道它是哪个子类

Posted

技术标签:

【中文标题】IQueryable vs IEnumerable 和多态,其中一个对象知道它是哪个子类【英文标题】:IQueryable vs IEnumerable and polymorphism where an object knows which subclass it is 【发布时间】:2020-06-18 16:51:55 【问题描述】:

当用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 概念中,使用父类型声明的子对象应该知道它实际上是子类型并使用子类型的方法。

【问题讨论】:

【参考方案1】:

IEnumerable&lt;T&gt; 上的 .Where 方法是 extension method。

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

【讨论】:

哇,有道理!感谢您的明确回答:)

以上是关于IQueryable vs IEnumerable 和多态,其中一个对象知道它是哪个子类的主要内容,如果未能解决你的问题,请参考以下文章

IQueryable vs IEnumerable 和多态,其中一个对象知道它是哪个子类

返回 IHttpActionResult vs IEnumerable<Item> vs IQueryable<Item>

IEnumerable<T> VS IList<T> VS IQueryable<T>

返回 IEnumerable<T> 与 IQueryable<T>

返回 IEnumerable<T> 与 IQueryable<T>

IQueryable 和 IEnumerable