我努力想要了解下面示例中列表中发生的事情:
public class DataObject
{
public List<object> SomeObjects { get; set; }
}
class Program
{
static void Main(string[] args)
{
var dataObj = new DataObject()
{
SomeObjects = { new object() },
};
Console.ReadKey();
}
}
dataOjb
的创建显然失败了,因为SomeObjects
属性尚未实例化。我假设没有编译错误,因为DataObject
可能有一个实例化SomeObjects
的构造函数。鉴于此,如果我尝试做类似的事情:
List<int> SomeObjects;
SomeObjects = {1, 2, 3, 4};
这显然不起作用,也没有:
List<int> SomeObjects = new List<int>();
SomeObjects = {1, 2, 3, 4};
所以为了得到我的实际问题,在第一个对象初始值设定项中调用了什么(我已经尝试查找它并且无法找到它),为什么它的行为方式不同,还有其他它可以像这样使用吗?
答案 0 :(得分:7)
所以为了得到我的实际问题,在第一个对象初始值设定项中调用的是什么
这是等效的代码:
var tmp = new DataObject();
tmp.SomeObjects.Add(new object());
var dataObj = tmp;
(显然,由于tmp.SomeObjects
在您的情况下为空,第二行失败。)
此= { ... }
语法仅适用于对象初始值设定项,这就是后两个代码段无效的原因。
更具体地说 - 在规范术语中 - 成员初始化程序的格式为
identifier = initializer-value
其中 initializer-value 是表达式或 object-or-collection-initializer 之一。这不仅适用于集合,而且......您也可以设置现有成员的属性:
var foo = new Foo {
Bar = {
X = 2,
Y = 3
}
};
相当于:
var tmp = new Foo();
tmp.Bar.X = 2;
tmp.Bar.Y = 3;
var foo = tmp;