2

在下面的示例中,我正在努力弄清楚 List 发生了什么:

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

所以要解决我的实际问题,在第一个对象初始化程序中调用的是什么(我试过查找但找不到它),为什么它的行为不同,还有其他地方可以像这样使用吗?

4

1 回答 1

7

所以要解决我的实际问题,第一个对象初始化程序中调用的是什么

这是等效的代码:

var tmp = new DataObject();
tmp.SomeObjects.Add(new object());
var dataObj = tmp;

(显然,第二行由于tmp.SomeObjects您的情况为空而失败。)

= { ... }语法适用于对象初始化程序,这就是后两个代码片段无效的原因。

更具体地说——在规范术语中——成员初始化器的形式是

identifier = initializer-value

其中initializer-valueexpressionobject-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;
于 2013-01-04T14:19:33.927 回答