Ответ 1
Компилятор не дает предупреждения, потому что у вас может быть:
public class R
{
public H Header { get; set; }
public R()
{
Header = new H();
}
}
поэтому Header
может быть инициализирован кем-то/чем-то. Решение, если кто-то/что-то инициализирует Header
, является сложной проблемой (вероятно, подобной проблеме Halting)... Не то, что компилятор хочет решить для вас: -)
Из спецификаций С#:
Инициализатор элемента, который указывает инициализатор объекта после знака равенства, является инициализатором вложенного объекта, то есть инициализацией внедренного объекта. Вместо назначения нового значения полю или свойства назначения в инициализаторе вложенных объектов рассматриваются как назначения членам поля или свойства. Инициализаторы вложенных объектов не могут применяться к свойствам с типом значения или к полям только для чтения со значением типа.
Мы находимся в случае вложенного инициализатора и видим выделенную часть. Я этого не знал.
Теперь обратите внимание, что new R { }
- с помощью С# spec, a 7.6.10.1 Object creation expressions
, за которым следует object-initializer
, а Header = { }
- "чистый" 7.6.10.2 Object initializers
.