Обойти это невозможно, спецификация C # прямо говорит, что "Инициализатор объекта или коллекции не может ссылаться на инициализируемый экземпляр объекта."
Что касается того, почему это невозможно, я подозреваю, что просто нет хорошего способа реализовать это. Нам нужен синтаксический сахар, эквивалентный
var temp = new TestClass();
temp.Id = 1;
temp.SomeProperty = SomeMethod(temp);
x = temp;
Нам просто нужно ключевое слово для ссылки на temp
в инициализаторе, но ни одно из них недоступно. Мы не можем использовать this
, потому что это уже означает что-то вне инициализатора. SomeProperty = this.SomeMethod(this)
должно быть эквивалентно temp.SomeProperty = this.SomeMethod(temp)
или temp.SomeProperty = temp.SomeMethod(temp)
? Второе непротиворечиво, но что произойдет, если нам понадобится первое?
Мы могли бы попытаться использовать x
, хотя мы можем выбрать имя, только если новый объект сразу назначен переменной. Однако теперь мы не можем ссылаться на старое значение x
внутри инициализатора, делая эквивалент temp.SomeProperty = SomeMethod(x)
.
Мы могли бы повторно использовать ключевое слово value
из установщиков свойств. Это звучит хорошо, поскольку value
уже заменяет отсутствующий параметр, если вы считаете, что средство получения свойства является синтаксическим сахаром для метода set_SomeProperty(value)
. Использование его для ссылки на отсутствующую переменную в инициализаторе объекта выглядит многообещающе. Тем не менее, мы могли бы создать этот объект внутри установщика свойств, в этом случае value
уже используется, и мы должны иметь возможность сделать temp.SomeProperty = SomeMethod(value)
.
Похоже, нам нужно создать новое ключевое слово только для этой цели, может быть, newthis
. Тем не менее, это серьезное изменение в языке, потому что любой код, имеющий переменную с именем newthis
, больше не работает. Как правило, Microsoft нуждается в действительно веской причине для внесения критических изменений, поэтому лучше запретить доступ к инициализируемому объекту.