Если метод возвращает интерфейс, конечно, он должен вернуть фактический объект класса, который реализует конкретный интерфейс.
Это обычно рассматривается как "контракт", который метод имеет с вызывающей стороной.,Метод говорит: «Я всегда буду возвращать то, что имеет именно это поведение».
В этом конкретном случае код запроса LINQ должен возвращать любой объект, который реализует интерфейс IEnumerable<int>
.
Другими словами, если вы сделаете это:
Debug.WriteLine(numQuery1.GetType().FullName);
, вы увидите возвращаемый тип фактический .
Следующий пример:
var numbers = new[] { 1, 2, 3, 4 };
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
Debug.WriteLine(numQuery1.GetType().FullName);
выведет это в .NET 4.0:
System.Linq.OrderedEnumerable`2 [[System.Int32, mscorlib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089]]
, которая указывает, что это System.Linq.OrderedEnumerable<int, int>
.
однако , и это реальная точка зрения, вам все равно.Все, что вам нужно знать, это то, что запрос LINQ возвращает что-то , которое реализует этот интерфейс.В будущей версии .NET код может на самом деле возвращать что-то еще, но все же объект, который реализует IEnumerable<T>
.