dynamic
От: Silver10  
Дата: 20.04.11 06:50
Оценка:
Добрый день, коллеги.

Перехожу на Framework 4 и не могу понять некоторых особенностей работы с dynamic

При выполнении следующего кода возникает ошибка: An expression tree may not contain a dynamic operation

@grid.GetHtml(
        columns: grid.Columns(
                    grid.Column(null, null, format: item =>
                    {
                        return Html.ActionLinkWithImage<ClientRecordController>(c => c.ClientRecordIndex(0, item.Id, null), "~/Content/Images/users.png", new { title = Resources.Details }, null, null);
                    }
                 )
        )


Здесь параметр format принимает делегат Func<dynamic, object>, а параметр функции ActionLinkWithImage<T> принимает Expression<Action<T>>

Если изменить код таким образом:

@grid.GetHtml(
        columns: grid.Columns(
                    grid.Column(null, null, format: item =>
                    {
                        int id = item.Id;
                        return Html.ActionLinkWithImage<ClientRecordController>(c => c.ClientRecordIndex(0, id, null), "~/Content/Images/users.png", new { title = Resources.Details }, null, null);
                    }
                 )
        )


то все работает. Почему?
Re: dynamic
От: Jack128  
Дата: 20.04.11 07:19
Оценка: +1
Здравствуйте, Silver10, Вы писали:

S>При выполнении следующего кода возникает ошибка: An expression tree may not contain a dynamic operation


S>то все работает. Почему?


та все ж написано в сообщении об ошибке. ExpressionTree (то есть тип Expression<...>) способно закодировать только ограниченный набор выражений. Причем компилятор си-шарпа неявно может преобразовать ещё меньший набор выражений (например в принципе циклы можно закодировать в exression-tree , но такой код Exression<Action<int []>> extp = arr => for(var = 0; i<arr.length; i++) {} — компилер не пропустит, нужно формировать дерево руками, вызывая методы класса Expression)

Операции с dynamic — в набор допустимых выражений не входят, отсюда и ошибка. Правда не в курсе, это ограничение деревьев или же компилера.
Re[2]: dynamic
От: Пельмешко Россия blog
Дата: 20.04.11 08:40
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Операции с dynamic — в набор допустимых выражений не входят, отсюда и ошибка. Правда не в курсе, это ограничение деревьев или же компилера.


Это ограничение C#, компилятор ET и DynamicExpression, и всякие statement'ы компилирует на ура
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.