Вызов метода для лямбда-выражения без необходимости объявления переменной - PullRequest
0 голосов
/ 28 декабря 2010

Учитывая этот метод расширения

    public static void Until(this Action action, Func<bool> booleanFunc)
    {
        while (!booleanFunc())
            action();
    }

можно ли превратить это

        var x = 0;

        Action ac = () => x += 1;
        ac.Until(() => x == 5);

в нечто подобное

        var x = 0;

        (() => x += 1).Until(() => x == 5);

То есть одинподкладка

Ответы [ 3 ]

3 голосов
/ 28 декабря 2010

ну лямбдам нужен тип.Одно только высказывание () => x += 1 ничего не говорит о делегате, которого он должен представлять.Поэтому укажите тип лямбды, передав его в конструктор.

new Action(() => x += 1).Until(() => x == 5);

Также работает приведение.

((Action)(() => x += 1)).Until(() => x == 5);
2 голосов
/ 28 декабря 2010

К сожалению, такой синтаксис невозможен, поскольку компилятор не может определить тип анонимного выражения.Это может быть Action, но также может быть какой-то другой пользовательский делегат.Вам нужно будет привести его к Action.

1 голос
/ 28 декабря 2010

Это интересно - я недавно обнаружил то же самое .

Вызовы методов расширения описаны в разделе 7.6.5.2 спецификации C #, и мне кажется, что все условия там выполнены ... потому что это говорит в терминах выражения, неявно преобразуемого в первый тип параметра (что в данном случае). Это говорит о том, что либо есть ошибка в компиляторе (возможно, но маловероятно), либо не выполнено одно из более ранних условий того, что он является допустимым вызовом метода.

Я подозреваю, что проблема в том, что лямбда-выражение не является первичным выражением в терминологии спецификаций - к сожалению, мой спецэффект сегодня не слишком силен из-за простуды. Большая часть остальной части механизма вызова метода, вероятно, полагается на знание типа цели метода, которая в этом случае неизвестна.

Обратите внимание, что у другого бросающегося в глаза "нетипизированного выражения" есть та же проблема - вы не можете вызывать методы расширения для литерала null.

Очень редко это ограничение вызывает боль, но большую часть времени у меня не возникает особых проблем с ним - и я подозреваю, что это делает компилятор намного проще для реализации ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...