Почему инициализатор не работает со свойствами, возвращающими список <t>? - PullRequest
8 голосов
/ 17 июня 2011

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

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

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

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

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

Ответы [ 6 ]

20 голосов
/ 17 июня 2011

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

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;
4 голосов
/ 17 июня 2011

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

MyNode newNode = new MyNode 
    {
        NodeName = "newNode",
        Children = new List<T> (/*smth*/)
    };
2 голосов
/ 17 июня 2011

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

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

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

2 голосов
/ 17 июня 2011

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

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

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

2 голосов
/ 17 июня 2011

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

T myT = /* smth */

MyNode newNode = new MyNode 
{
    NodeName = "newNode",
    Children = new List<T> { myT }
};
2 голосов
/ 17 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...