繁体   English   中英

列表属性的空集合初始值设定项导致null

[英]Empty collection initializer for list property results in null

当我运行此代码时 ,它不会像我期望的那样将ThisIsAList初始化为一个空集合...相反, ThisIsAList为null。

void Main()
{
    var thing = new Thing
    {
        ThisIsAList = {}
    };

    Console.WriteLine(thing.ThisIsAList == null); // prints "True"
}

public class Thing
{
    public List<string> ThisIsAList { get; set; }
}

为什么这不是编译错误? 为什么结果为null


我想知道这里是否正在进行隐式转换,但是以下尝试产生了编译错误:

thing.ThisIsAList = Enumerable.Empty<string>().ToArray();
List<int> integers = { 0, 1, 2, 3 };

根据有关集合初始化程序的 MSDN文档,听起来像集合初始化程序基本上只是为您处理调用Add()的过程。 所以我寻找List.Add可能的重载,但没有找到我认为适用的任何内容。

有人可以解释一下C#规范在做什么吗?

在C#5.0规范的7.6.10.2节中:

在等号后指定集合初始化程序的成员初始化程序是嵌入式集合的初始化。 代替为字段或属性分配新的集合,将初始化器中给定的元素添加到由field或property引用的集合中 字段或属性的收集类型必须满足第7.6.10.3节中指定的要求。

(强调我的)

因此,由于您的集合初始值设定项嵌套在另一个对象/集合初始值设定项中,因此其行为是将其初始化的成员解析为一个值,然后添加相关项。 在这种情况下,该属性为null ,以便解析null值,并添加初始化程序中的所有零项。 如果您实际上尝试添加项目,则将引发NRE,因为您试图将项目添加到null对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM