C # Использование списков присваивания, которые ссылаются на присвоенную переменную - PullRequest
2 голосов
/ 01 декабря 2011

Кто-нибудь знает трюк, который позволил бы мне сделать что-то вроде этого (где функция является Func<bool>:

        UnaryNode<bool> compliment = new UnaryNode<bool>()
            { Function = () => !compliment.Right.Value };

Следующее работает на месте, но не так хорошо.

        UnaryNode<bool> compliment = new UnaryNode<bool>();
        compliment.Function = () => !compliment.Right.Value;

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Это запрещено, как указано в спецификации 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

Это более или менее "хорошо", чем то, что у вас уже есть?

1 голос
/ 01 декабря 2011

Возможно, вы сможете создать новый класс.

class ComplimentUnaryNode : UnaryNode<bool>
{
    public ComplimentUnaryNode()
    {
        Function = () => !Right.Value;
    }
}
...