4

我在这里想念什么?我希望以下内容可以正常工作:

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”

我没有使用对象初始化程序吗?为什么它假设一个集合初始化器?(我使用的是 Visual Studio 2012。)

4

1 回答 1

8

要使用对象初始化器,您必须指定要设置的属性:

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),
于 2012-09-27T21:14:59.433 回答