Почему инициализатор не работает со свойствами, возвращающими list‹t›?

Не смог найти ответ на этот вопрос. Это должно быть очевидно, но все же.

Я пытаюсь использовать инициализатор в этом упрощенном примере:

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

где Children — это свойство этого класса, которое возвращает список. И здесь я сталкиваюсь с ошибкой, которая звучит как «Неверный декларатор члена инициализатора».

Что здесь не так и как вы инициализируете такие свойства? Заранее большое спасибо!


person tube-builder    schedule 17.06.2011    source источник
comment
Это не инициализация свойства. Вы вызываете метод.   -  person BoltClock    schedule 17.06.2011


Ответы (6)


Вы не можете вызывать такие методы в инициализаторах объектов — вы можете только устанавливать свойства или поля, а не вызывать методы. Однако в этом случае вы, вероятно, можете использовать синтаксис инициализатора объекта и коллекции:

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;
person Jon Skeet    schedule 17.06.2011

Это потому, что свойство детей не инициализировано

MyNode newNode = new MyNode 
    {
        NodeName = "newNode",
        Children = new List<T> (/*smth*/)
    };
person Atzoya    schedule 17.06.2011

Поскольку вы выполняете метод, а не присваиваете значение

person John    schedule 17.06.2011

Синтаксис инициализатора поля можно использовать только для установки полей и свойств, а не для вызова методов. Если Children равно List<T>, вы можете сделать это таким образом, включив также синтаксис инициализатора списка:

T myT = /* smth */

MyNode newNode = new MyNode 
{
    NodeName = "newNode",
    Children = new List<T> { myT }
};
person recursive    schedule 17.06.2011

Следующее не устанавливает значение в инициализаторе:

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

Он пытается получить доступ к члену поля (тоже еще не инициализированному).

person Grant Thomas    schedule 17.06.2011

Инициализаторы предназначены только для инициализации свойств, а не других действий.

Вы не пытаетесь инициализировать список Children, вы пытаетесь что-то добавить в него.

Children = new List<smth>() инициализирует его.

person Øyvind Bråthen    schedule 17.06.2011