Me surgió algo bastante desconcertante en C# recientemente. En nuestra base de código, tenemos una clase TreeNode
. Al cambiar un código, descubrí que era imposible asignar una variable a la propiedad Nodes
. En una inspección más cercana quedó claro que la propiedad es de solo lectura y que este comportamiento es de esperar.Configuración de una propiedad de solo lectura con tipo anónimo
Lo extraño es que nuestra base de código hasta entonces siempre dependía de la asignación de algún tipo anónimo a la propiedad Nodes
y se compiló y funcionó a la perfección.
En resumen: ¿por qué la tarea en AddSomeNodes
funcionó en primer lugar?
using System.Collections.Generic;
namespace ReadOnlyProperty
{
public class TreeNode
{
private readonly IList<TreeNode> _nodes = new List<TreeNode>();
public IList<TreeNode> Nodes
{
get { return _nodes; }
}
}
public class TreeBuilder
{
public IEnumerable<TreeNode> AddSomeNodes()
{
yield return new TreeNode
{
Nodes = { new TreeNode() }
};
}
public IEnumerable<TreeNode> AddSomeOtherNodes()
{
var someNodes = new List<TreeNode>();
yield return new TreeNode
{
Nodes = someNodes
};
}
}
}
@Downvoter Why the downvote? Mi observación sobre la situación de los OP es precisa según la documentación y mis propias pruebas. Por no mencionar todas las demás respuestas. –
¡Acabo de recibir un voto negativo también! – MBen
¡Gracias por proporcionar una respuesta tan completa y concisa tan rápido! Tiene toda la razón al decir que cometí un error al llamarlo de tipo anónimo. Este comportamiento tiene sentido cuando se considera la sintaxis de inicialización de la colección, no la asignación de un tipo anónimo. A veces es difícil desambiguar estos conceptos mentalmente porque son tan sintácticamente iguales. ¡Gracias! – Michiel