Это запрещено, как указано в спецификации langauge . Раздел 7.6.10.2:
Невозможно, чтобы инициализатор объекта ссылался на недавно
созданный объект он инициализирует.
И я не нахожу вашу вторую версию ни в коем случае не "хорошей". Что касается «уловки», это было бы что-то еще более «уродливое». Вам нужно будет создать временный выброс, а затем полагаться на закрытие лямбда-переменных вместо значения. Например, учитывая:
class Foo
{
public Func<bool> Function;
public Bar Bar;
}
class Bar
{
public bool Value;
}
Вы могли бы тогда иметь
// DO NOT try this at home
Foo foo = null;
Foo temp = new Foo { Function = () => !foo.Bar.Value };
foo = temp;
bool result1 = foo.Function(); // true
foo.Bar.Value = true;
bool result2 = foo.Function(); // false
Это более или менее "хорошо", чем то, что у вас уже есть?