为什么初始化程序不能使用返回list 的属性?

找不到这个问题的答案。 它必须是显而易见的,但仍然是。

我尝试在这个简化的例子中使用初始化器:

MyNode newNode = new MyNode { NodeName = "newNode", Children.Add(/*smth*/) // mistake is here }; 

其中Children是此类的属性,它返回一个列表。 在这里,我遇到了一个错误,就像’无效的初始化成员声明符’。

这里有什么问题,你如何初始化这些属性? 非常感谢提前!

你不能在对象初始化器中调用这样的方法 – 你只能设置属性或字段,而不是调用方法。 但是在这种情况下,您可能仍然可以使用对象和集合初始化器语法:

 MyNode newNode = new MyNode { NodeName = "newNode", Children = { /* values */ } }; 

请注意,这不会尝试为Children分配新值,它会调用Children.Add(...) ,如下所示:

 var tmp = new MyNode(); tmp.NodeName = "newNode": tmp.Children.Add(value1); tmp.Children.Add(value2); ... MyNode newNode = tmp; 

这是因为children属性未初始化

 MyNode newNode = new MyNode { NodeName = "newNode", Children = new List (/*smth*/) }; 

因为您正在执行方法,而不是分配值

字段初始值设定项语法只能用于设置字段和属性,而不能用于调用方法。 如果ChildrenList ,您可以通过这种方式完成它,还包括列表初始化器语法:

 T myT = /* smth */ MyNode newNode = new MyNode { NodeName = "newNode", Children = new List { myT } }; 

以下内容未在初始化器中设置值:

 Children.Add(/*smth*/) // mistake is here 

它试图访问一个字段的成员(一个尚未初始化的字段)。

初始化程序只是初始化属性,而不是其他操作。

您没有尝试初始化子项列表,而是尝试向其添加内容。

Children = new List()正在初始化它。