8

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

我尝试在这个简化的示例中使用初始化程序:

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

其中 Children 是此类的一个属性,它返回一个列表。在这里我遇到了一个错误,类似于“无效的初始化程序成员声明器”。

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

4

6 回答 6

23

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

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;
于 2011-06-17T12:38:33.733 回答
4

这是因为 children 属性没有初始化

MyNode newNode = new MyNode 
    {
        NodeName = "newNode",
        Children = new List<T> (/*smth*/)
    };
于 2011-06-17T12:38:11.410 回答
2

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

于 2011-06-17T12:37:36.967 回答
2

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

T myT = /* smth */

MyNode newNode = new MyNode 
{
    NodeName = "newNode",
    Children = new List<T> { myT }
};
于 2011-06-17T12:37:39.427 回答
2

以下未在初始化程序中设置值:

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

它正在尝试访问一个字段的成员(也是一个尚未初始化的成员。)

于 2011-06-17T12:38:08.680 回答
2

Initializers 只是初始化属性,而不是其他动作。

您不是在尝试初始化 Children 列表,而是在尝试向其中添加一些内容。

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

于 2011-06-17T12:38:58.400 回答