列表创建和对象初始值设定项

时间:2013-01-04 14:16:04

标签: c#

我努力想要了解下面示例中列表中发生的事情:

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

所以为了得到我的实际问题,在第一个对象初始值设定项中调用了什么(我已经尝试查找它并且无法找到它),为什么它的行为方式不同,还有其他它可以像这样使用吗?

1 个答案:

答案 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;