2013-01-04 77 views
2

我努力让我的头周围发生了什么,在下面的例子中的列表发生的事情:列表的创建和对象初始

创作 dataOjb
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(); 
    } 
} 

因为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显然是空的。)

This = { ... } syntax is only适用于对象初始值设定项,这就是为什么您的后两个代码段无效。

更具体地 - 并且在说明书中的术语 - 一个构件-初始化是形式

identifier = initializer-value 

其中初始值表达对象或收集初始化程序中的一个的。这不仅适用于收藏,但...你可以设置现有成员的特性,也:

var foo = new Foo { 
    Bar = { 
     X = 2, 
     Y = 3 
    } 
}; 

这相当于:

var tmp = new Foo(); 
tmp.Bar.X = 2; 
tmp.Bar.Y = 3; 
var foo = tmp; 
+0

谢谢,乔恩。这正是我想知道的。 –