When I 运行这段代码,它不初始化ThisIsAList
正如我所期待的那样,到一个空集合......而不是ThisIsAList
为空。
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 };
根据 MDN 文档集合初始值设定项,听起来集合初始值设定项基本上只是处理调用Add()
为你。所以
我寻找可能的重载List.Add,但没有找到任何我认为适用的内容。
有人可以从 C# 规范解释这里发生了什么吗?
在 C# 5.0 规范的第 7.6.10.2 节中:
在等号后指定集合初始值设定项的成员初始值设定项是嵌入式集合的初始化。初始化程序中给定的元素将添加到字段或属性引用的集合中,而不是将新集合分配给字段或属性。字段或属性必须是满足第 7.6.10.3 节中指定的要求的集合类型。
(强调我的)
因此,由于您的集合初始值设定项嵌套在另一个对象/集合初始值设定项中,因此行为是将其初始化为值的成员解析,然后添加相关项。在这种情况下,该属性是null
, 以便null
值已解析,并且初始值设定项中的所有零项均已添加。如果您确实尝试添加一个项目,它会抛出一个 NRE,因为您试图将一个项目添加到null
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)