对象初始化不适合我

Jon*_*ood 4 c# syntax object-initializers collection-initializer

我在这里错过了什么?我希望以下工作正常:

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 });
Run Code Online (Sandbox Code Playgroud)

相反,我{在最后三行的每个字符上都出现错误:

无法使用集合初始值设定项初始化类型'xxx.yyy.ProposalFileInfo',因为它没有实现'System.Collections.IEnumerable'

我没有使用Object初始化器吗?为什么它假设一个集合初始化器?(我正在使用Visual Studio 2012.)

Jon*_*eet 8

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

attachments.Add(new ProposalFileInfo { FileId = 1, IsSupportDocument = false });
Run Code Online (Sandbox Code Playgroud)

因此,将整个初始化转换为集合初始化程序,我们最终得到:

var attachments = new List<ProposalFileInfo>
{
    new ProposalFileInfo { FileId = 1, IsSupportDocument = false },
    new ProposalFileInfo { FileId = 2, IsSupportDocument = false },
    new ProposalFileInfo { FileId = 3, IsSupportDocument = false },
};
Run Code Online (Sandbox Code Playgroud)

但是,只需添加一个构造函数即可使代码更简单ProposalFileInfo:

public ProposalFileInfo(int fileId, bool isSupportDocument)
{
    FileId = fileId;
    IsSupportDocument = isSupportDocument;
}
Run Code Online (Sandbox Code Playgroud)

然后你的初始化可以是:

var attachments = new List<ProposalFileInfo>
{
    new ProposalFileInfo(1, false),
    new ProposalFileInfo(2, false),
    new ProposalFileInfo(3, false)
};
Run Code Online (Sandbox Code Playgroud)

如果您认为要指定每个参数的含义(或其中一些),并且您使用的是C#4,则可以使用命名参数,例如

    new ProposalFileInfo(1, isSupportDocument: false),
Run Code Online (Sandbox Code Playgroud)