Ваши наблюдения точны - на самом деле они отражают наблюдения, сделанные Мэдсом Торгерсеном, премьер-министром по языку Microsoft C #.
Мэдс сделал пост в октябре 2006 года на эту тему под названием Что такое коллекция? , в котором он написал:
Допустим, мы взорвали это в первом
версия фреймворка с
System.Collections.ICollection, которая
рядом с бесполезным. Но мы исправили это
довольно хорошо, когда появились дженерики
в .NET Framework 2.0:
System.Collections.Generic.ICollection
позволяет добавлять и удалять элементы,
перечисли их, посчитай и проверь
для членства.
Очевидно, что с этого момента все
применять ICollection каждый раз
они делают коллекцию, верно? Не так.
Вот как мы использовали LINQ, чтобы узнать
о том, что коллекции на самом деле, и
как это заставило нас изменить наш язык
дизайн в C # 3.0.
Оказывается, что в платформе есть только 14 реализаций ICollection<T>
, но 189 классов, которые реализуют IEnumerable
и имеют открытый метод Add()
.
У этого подхода есть скрытое преимущество - если бы они основывали его на интерфейсе ICollection<T>
, был бы точно один поддерживаемый метод Add()
.
Напротив, подход, который они использовали, означает, что инициализаторы для коллекции просто формируют наборы аргументов для методов Add()
.
Для иллюстрации давайте немного расширим ваш код:
class Test : IEnumerable
{
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
public void Add(int i) { }
public void Add(int i, string s) { }
}
Теперь вы можете написать это:
class Program
{
static void Main()
{
Test test
= new Test
{
1,
{ 2, "two" },
3
};
}
}