Инициализация объекта у меня не работает

Что мне здесь не хватает? Я ожидал, что следующее будет работать нормально:

public class ProposalFileInfo
{
    public int FileId { get; set; }
    public bool IsSupportDocument { get; set; }
}

// ...

var attachments = new List<ProposalFileInfo>();

attachments.Add(new ProposalFileInfo { 1, false });
attachments.Add(new ProposalFileInfo { 2, false });
attachments.Add(new ProposalFileInfo { 3, false });

Вместо этого я получаю сообщение об ошибке у символа { в каждой из последних трех строк:

Невозможно инициализировать тип xxx.yyy.ProposalFileInfo с помощью инициализатора коллекции, поскольку он не реализует System.Collections.IEnumerable.

Я не использую инициализатор Object? Почему он предполагает инициализатор коллекции? (Я использую Visual Studio 2012.)


person Jonathan Wood    schedule 27.09.2012    source источник


Ответы (1)


Чтобы использовать инициализатор object, вы должны указать, какие свойства вы хотите установить:

attachments.Add(new ProposalFileInfo { FileId = 1, IsSupportDocument = false });

Итак, преобразовав всю вашу инициализацию в инициализатор коллекции, мы получим:

var attachments = new List<ProposalFileInfo>
{
    new ProposalFileInfo { FileId = 1, IsSupportDocument = false },
    new ProposalFileInfo { FileId = 2, IsSupportDocument = false },
    new ProposalFileInfo { FileId = 3, IsSupportDocument = false },
};

Однако вы можете упростить свой код, просто добавив конструктор в ProposalFileInfo:

public ProposalFileInfo(int fileId, bool isSupportDocument)
{
    FileId = fileId;
    IsSupportDocument = isSupportDocument;
}

Тогда ваша инициализация может быть просто:

var attachments = new List<ProposalFileInfo>
{
    new ProposalFileInfo(1, false),
    new ProposalFileInfo(2, false),
    new ProposalFileInfo(3, false)
};

Если вы чувствуете, что хотите указать, что означает каждый аргумент (или некоторые из них), и вы используете C # 4, вы можете использовать именованные аргументы, например

    new ProposalFileInfo(1, isSupportDocument: false),
person Jon Skeet    schedule 27.09.2012