Если разрешено присваивать объекту только для чтения свойства типа класса, такие как Bar, в инициализаторе объекта (которым он является [...])
Нет, это не так. Инициализаторы объектов вызывают конструктор, а затем присваивают его свойствам. Например, этот код:
var buzz = new Foo { Primitive = 1 };
это просто синтаксический сахар для этого:
var buzz = new Foo();
buzz.Primitive = 1;
Это недопустимо, если Primitive
- свойство только для чтения.
(Чтобы быть очень педантичным, более уместно рассматривать его как присвоение временной локальной переменной, задание свойств, а затем присвоение buzz
в самом конце, но мы пока проигнорируем это.)
Код, который вы наблюдали за работой, не устанавливает эти свойства только для чтения - он получает их, а затем устанавливает значения, используя возвращенную ссылку. Итак, это:
var baz = new Foo { Bar = { Prop = "Hello World!" } }
фактически эквивалентно:
var baz = new Foo();
baz.Bar.Prop "Hello World!";
Это полностью верно, даже если Bar
только для чтения.