用于将项目添加到对象初始化器中的集合的语法糖

概要

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

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" }
        };
    }
}

调用会Test.Factory()导致Test对象的Things集合同时包含"First""Second"

看起来该行Things = { "Second" }调用的Add方法Things如果ICollection将更改为IEnumerable,则会出现语法错误,指出“ IEnumerable<string> does not contain a definition for 'Add'”。

显然,您只能在对象初始化程序中使用这种语法。这样的代码无效:

var test = new Test();
test.Things = { "Test" };

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

帕特里克·霍夫曼

它称为集合初始化程序,它是在C#3语言规范中添加的(在介绍中为7.5.10.3节,当前规范为7.6.10.3节)。具体来说,您使用的代码使用嵌入式集合初始化程序。

集合初始化程序实际上只是调用Add方法,这是规范所必需的。

正如Quantic所说,规格说:

在等号后指定集合初始化程序的成员初始化程序是嵌入式集合的初始化。代替为字段或属性分配新的集合,将初始化器中给定的元素添加到由字段或属性引用的集合中。

这说明您的意外结果相当不错。

为什么仅在对象初始化程序中可用?

因为在其他地方没有意义。您可以Add自己调用该方法,而不是使用初始化程序进行初始化以外的其他操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章