W ostatnim czasie pojawił się w C# problem dość kłopotliwy. W naszej bazie kodu mamy klasę TreeNode
. Podczas zmiany kodu okazało się, że nie można przypisać zmiennej do właściwości Nodes
. Po bliższej inspekcji stało się jasne, że właściwość jest tylko do odczytu i można się spodziewać takiego zachowania.Ustawianie właściwości tylko do odczytu z anonimowym typem
Dziwne jest to, że nasza podstawa kodu do tej pory zawsze polegała na przypisaniu jakiegoś anonimowego typu do właściwości Nodes
i została skompilowana i działała idealnie.
Podsumowując: dlaczego zlecenie w AddSomeNodes
działało w pierwszej kolejności?
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 Dlaczego upadł? Moja obserwacja sytuacji w OP jest dokładna zgodnie z dokumentacją i własnymi testami. Nie wspominając o wszystkich innych odpowiedziach. –
Właśnie dostałem głosowanie w dół! – MBen
Dzięki za tak szybką i kompletną odpowiedź! Masz całkowitą rację, że popełniłem błąd, nazywając to anonimowym typem. Takie zachowanie ma sens, gdy bierze się pod uwagę składnię inicjalizacji kolekcji, a nie przypisanie typu anonimowego. Czasami trudno jest ujednoznacznić te koncepcje psychicznie, ponieważ są one tak podobne pod względem składniowym. Dzięki! – Michiel