IQueryable против IEnumerable и полиморфизм, когда объект знает, какой это подкласс - PullRequest
0 голосов
/ 06 марта 2020

При явном объявлении типа запроса с помощью 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, где дочерний объект, объявленный с родительским типом, должен знать, что это на самом деле тип потомка и использовать методы дочернего типа.

1 Ответ

3 голосов
/ 06 марта 2020

Метод .Where в IEnumerable<T> является методом расширения .

В результате он не может быть виртуальным . Только виртуальные методы демонстрируют ожидаемый полиморфизм

...