用于将对象添加到对象初始化程序中的集合的语法糖

Syn*_*tic 7 c# syntax

最近,我遇到了一些看起来像这样的代码:

public class Test
{
    public ICollection<string> Things { get; set; }

    public Test()
    {
        Things = new List<string> { "First" };
    }

    public static Test Factory()
    {
        return new Test
        {
            Things = { "Second" }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

调用带有包含和的集合Test.Factory()Test对象的结果.Things"First""Second"

看起来该行Things = { "Second" }调用了Add方法Things.如果ICollection更改为a IEnumerable,则表示语句错误" IEnumerable<string> does not contain a definition for 'Add'".

很明显,您只能在对象初始化器中使用这种语法.这样的代码无效:

var test = new Test();
test.Things = { "Test" };
Run Code Online (Sandbox Code Playgroud)

这个功能的名称是什么?它引入了哪个版本的C#?为什么它仅在对象初始化器中可用?

Pat*_*man 5

它被称为集合初始化程序,它是在C#3语言规范中添加的(引言中的第7.5.10.3节,当前规范中的第7.6.10.3节).具体而言,您使用的代码使用嵌入式集合初始值设定项.

集合初始化程序实际上只是调用Add方法,这是根据规范要求的.

正如Quantic评论的那样,规格说:

在等号后面指定集合初始值设定项的成员初始值设定项是嵌入式集合的初始化.而不是将新集合分配给字段或属性,初始化程序中给出的元素将添加到字段或属性引用的集合中.

这解释了你意想不到的结果非常好.

为什么它仅在对象初始化器中可用?

因为它在其他地方没有意义.您可以Add自己调用该方法,而不是使用初始化器而不是初始化.