Замена var на имя типа в запросе Linq - PullRequest
0 голосов
/ 21 мая 2018

У меня есть следующий код:

List<string> myCars = new List<string>()
    { "Mercury Cougar", "Dodge Dart", "Ford Taurus SHO",
      "Dodge Charger", "Chevrolet Blazer", "Dodge Neon" };

    var dodges = from someCars in myCars
                 where someCars.Contains("Dodge")
                 orderby someCars descending
                 select someCars;

Console.WriteLine(dodges.GetType()); //System.Linq.OrderedEnumerable`2[System.String,System.String]

dodges.GetType() возвращает полностью определенное имя в синтаксисе CIL.

Если я переведу его на C # и использую его для замены var, он не компилируется:

Тип или имя пространства имен 'OrderedEnumerable <,>' не существует в пространстве имен 'System.Linq' (вам не хватает ссылки на сборку?)

System.Linq.OrderedEnumerable<string, string> dodges = from someCars in myCars
                         where someCars.Contains("Dodge")
                         orderby someCars descending
                         select someCars;

Это потому, что OrderedEnumerable<string, string> недоступен, доступен только System.Linq.IOrderedEnumerable<string>.

Почему OrderedEnumerable<string, string> недоступен?

1 Ответ

0 голосов
/ 21 мая 2018

Почему OrderedEnumerable<string, string> недоступно

Потому что это "внутреннее" внедрение интерфейса.Нет причин, по которым он должен быть доступен или задокументирован.С LINQ вы должны программировать с интерфейсами (IEnumerable<>, IOrderedEnumerable<>, IQueryable<> ...)

Если вы посмотрите, все методы LINQ возвращают внутренний класс, производный от одного из этих интерфейсови часто они могут возвращать экземпляры нескольких разных классов, в зависимости от ввода.Например, Enumerable.Select() может возвращать new SelectListIterator<TSource, TResult> или SelectIListIterator<TSource, TResult>, или new SelectIPartitionIterator<TSource, TResult>, или различные другие классы, в зависимости от типа ввода IEnumerable<>.

...