2011-06-17 8 views
7

No se pudo encontrar una respuesta a esta pregunta. Debe ser obvio, pero aún así.¿Por qué el inicializador no funciona con las propiedades que devuelven la lista <t>?

intento utilizar inicializador en este ejemplo simplificado:

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

donde los niños es una característica de esta clase, que devuelve una lista. Y aquí me tropiezo con un error, que dice "Invalid initializer member declarator".

¿Qué ocurre aquí y cómo inicializar dichas propiedades? ¡Muchas gracias por adelantado!

+0

Eso no está inicializando una propiedad. Estás llamando a un método. – BoltClock

Respuesta

19

No puede invocar métodos como este en los inicializadores de objetos; solo puede establecer propiedades o campos, en lugar de llamar a los métodos. Sin embargo, en este caso es probable que puede seguir utilizando inicializador de colección de objetos y la sintaxis:

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

Tenga en cuenta que esto no va a tratar de asignar un nuevo valor a Children, se llamará Children.Add(...), así:

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

Debido a que usted está ejecutando un método, no la asignación de un valor de sintaxis inicializador

2

El campo sólo se puede utilizar para configurar los campos y propiedades, no para llamar métodos. Si Children es List<T>, es posible que pueda llevar a cabo de esta manera, al incluir también la sintaxis lista de inicialización:

T myT = /* smth */ 

MyNode newNode = new MyNode 
{ 
    NodeName = "newNode", 
    Children = new List<T> { myT } 
}; 
2

los siguientes no es el establecimiento de un valor en el inicializador:

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

Se trata de intentar acceder a un miembro de un campo (uno que aún no es inicializado, también.)

4

es porque la propiedad no se ha inicializado niños

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

Inicializadores es solo para inicializar las propiedades, no otras acciones.

Usted no está tratando de inicializar la lista de niños, está tratando de agregarle algo.

Children = new List<smth>() lo está inicializando.

Cuestiones relacionadas