Если вы прочитаете фактические ошибки компилятора ( и документы для инициализаторов коллекции ), вы обнаружите, что инициализаторы коллекции являются просто синтаксическим сахаром для вызовов Add()
:
CS1950: лучший метод инициализации перегруженной коллекции System.Collections.Generic.ICollection<Bar>.Add(Bar)
имеет недопустимые аргументы
CS1503: аргумент #1
не может преобразовать выражение System.Collections.Generic.IEnumerable<Bar>
в тип Bar
Таким образом, синтаксис SomeCollection = { someItem }
будет скомпилирован в SomeCollection.Add(someItem)
.И вы не можете добавить IEnumerable<Bar>
к коллекции Bar
s.
Вам необходимо вручную добавить все элементы:
foreach (bar in items.Select(s => new Bar { Prop = s }))
{
foo.Bars.Add(bar);
}
Или, если вашей целью является более короткий код, сделайте то же самое в конструкторе Foo2
:
public class Foo2
{
public ICollection<Bar> Bars { get; }
public Foo2() : this(Enumerable.Empty<Bar>()) { }
public Foo2(IEnumerable<Bar> bars)
{
Bars = new List<Bar>(bars);
}
}
Затем вы можете инициализировать Foo2 следующим образом:
var foo = new Foo2(items.Select(...));
Для забавного злоупотребления синтаксисом инициализатора коллекции, как это предусмотрено @JeroenMostert, вы можете использовать метод расширения:
public static class ICollectionExtensions
{
public static void Add<T>(this ICollection<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
{
collection.Add(item);
}
}
}
Что позволяет это:
public class Foo
{
public ICollection<string> Bar { get; } = new List<string>();
}
var foo = new Foo
{
Bar = { new [] { "foo", "bar", "baz" } }
};
Но это просто противно.