Пример:
System.Web.Security.MembershipCollection
реализации IEnumerable
и нет IEnumberable<T>
. Почему это не реализует последнего, когда кажется, что это было бы лучше (например, использовало бы LINQ)?
Или, это не обязательно лучше?
Вы можете использовать LINQ с любым IEnumerable
с помощью функции Cast
или функции OfType
. Если вы уверены, что IEnumerable
содержит только объекты определенного типа, то Cast
будет немного быстрее.
Например,
ArrayList foo = new ArrayList();
foo.Add("bar");
foo.Add("baz");
var bar = foo.Cast<string>().Select(s => s.ToUpper());
Есть много существующих классов (например, ArrayList
), которые существовали до появления generics в .NET, поэтому они все еще не являются generic.
Следует помнить, что многие из используемых нами типов BCL относятся к периоду до появления generics, которые появились в версии 2.0. Однако вы все еще можете использовать LINQ со многими из них, вам просто придется проделать немного дополнительной работы.
ArrayList arrayList = new ArrayList();
arrayList.Add(1);
arrayList.Add(2);
var query = from item in arrayList.OfType<int>() select item;
Эти классы часто датируются временем до появления дженериков в .net Многие такие классы имеют дженериковые эквиэвенты, но не все. Есть и обходные пути. Например, в linq любые не generic коллекции можно сделать linqy и generic с помощью методов расширения .Cast() и .OfType().
История имеет значение. Дженерики существовали не всегда, поэтому вы можете встретить классы и API, которые были разработаны до появления дженериков.
Также имеет значение целевая аудитория. Некоторые функции нацелены на аудиторию разработчиков, у которых могут быть проблемы с пониманием универсальных шаблонов :
Компромисс : API, использующие некоторые расширенные функции универсальных шаблонов, могут быть слишком трудными для используются некоторыми разработчиками. Концепция универсальных шаблонов не очень понятна, в некоторых случаях синтаксис может создавать проблемы, и, как любая большая новая функция, Обобщения могут потребовать значительного обучения некоторым разработчикам начального уровня.
Да, это цитата из 2004 года, но некоторые, если не большая часть API .Net, которые вы используете сегодня, вышли в 2005 году, так что цитата на самом деле очень актуальна.