Выражение. Или, параметр 'объект' не находится в объеме

Хотя одномерный массив очень похож на указатель на элемент массива, многомерный массив не является указателем на указатель ... или массивом указателей. В памяти он организован как одномерный массив, единственное отличие состоит в том, что компилятор знает, как вычислить адрес из более чем одного индекса.

Ваш массив организован в памяти следующим образом

a000 a001 a002 a010 a011 a012 a020 a021 a022 a100 a101 a101 ...

, где a[0][0][0] и т. Д. Записывается как a000 и т. Д. Для экономии места. Вы можете сделать

newMate(args[1])

, если определите newMate для получения двумерного массива

struct MateMessage newMate(char cr[3][3]) {
    int i,j;
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            doSomethingWith(cr[i][j]);
        }
    }
    return something;
}

В этом случае функция, вызывающая, передаст адрес a[1][0][0] в [ 117] и newMate будут знать, как обратиться к оставшимся двум измерениям.

8
задан ccook 4 January 2009 в 22:23
поделиться

4 ответа

Проблема - то, что Выражение, Вы создаете в методе OrExpressions, снова использует орган по этим двум выражениям. Те тела будут содержать ссылки на свой собственный ParameterExpression, который был определен в FilterExpression.

Фиксация должна была бы переписать левые и правые части для использования нового ParameterExpression. Или провести исходный ParameterExpression. Именно, не потому что два ParameterExpression имеют то же имя, они представляют тот же параметр.

9
ответ дан 5 December 2019 в 08:54
поделиться

Как уже предложено, здесь можно найти этот очень хороший (рабочий) код

public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
{
    var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
    return Expression.Lambda<Func<T, bool>>(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
}

то, что можно адаптироваться к потребностям и который не связывается (по моему скромному мнению), с LINQ.

5
ответ дан 5 December 2019 в 08:54
поделиться

Я не уверен в надлежащих условиях здесь, но в основном параметры выражения не эквивалентны, даже если у них есть то же имя.

Это означает это

var param1 = Expression.Parameter(typeof(T), "item");
var param2 = Expression.Parameter(typeof(T), "item");

param1 != param2

param1 и param2 не будут тем же самым, если используется в выражении.

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

Править: Кроме того, при попытке динамично сочинить, где пункты в LINQ, Вы могли дать PredicateBuilder попытку.

2
ответ дан 5 December 2019 в 08:54
поделиться

Решение Фабрицио тоже пришло мне в голову, но, поскольку я пытался объединить два выражения, которые будут выполняться как sql-запрос linq 2, я подумал, что это будет выполнять в памяти, а не на сервере sql.

Мне писали: Linq-To-Sql распознает, что вызов является лямбда-выражением, и, таким образом, по-прежнему производит оптимизированный sql.

1
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: