为什么初始化程序不能使用返回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*/) };
因为您正在执行方法,而不是分配值
字段初始值设定项语法只能用于设置字段和属性,而不能用于调用方法。 如果Children
是List
,您可以通过这种方式完成它,还包括列表初始化器语法:
T myT = /* smth */ MyNode newNode = new MyNode { NodeName = "newNode", Children = new List { myT } };
以下内容未在初始化器中设置值:
Children.Add(/*smth*/) // mistake is here
它试图访问一个字段的成员(一个尚未初始化的字段)。
初始化程序只是初始化属性,而不是其他操作。
您没有尝试初始化子项列表,而是尝试向其添加内容。
Children = new List
正在初始化它。