Как скопировать значение переменной типа int, на которую указывает указатель или ссылка, в другую переменную типа int при помощи Expression.Assign?

Как исправить исключение "Expression of type 'int&' cannot be used for assignment to type 'int'" при создании LINQ Expression, который должен реализовать указанный код?
  • 5 июля 2024 г. 10:32
Ответы на вопрос 2
Для копирования значения переменной типа int, на которую указывает указатель или ссылка, в другую переменную типа int при помощи Expression.Assign можно воспользоваться следующим кодом:

```csharp
ParameterExpression sourceParam = Expression.Parameter(typeof(int), "source");
ParameterExpression targetParam = Expression.Parameter(typeof(int), "target");

var copyExpr = Expression.Assign(targetParam, sourceParam);

var lambda = Expression.Lambda<Action<int, int>>(copyExpr, sourceParam, targetParam).Compile();

int sourceValue = 10;
int targetValue = 0;

lambda(sourceValue, targetValue);

Console.WriteLine(targetValue); // Выведет 10
```

Чтобы исправить исключение "Expression of type 'int&' cannot be used for assignment to type 'int'", необходимо создать временную переменную типа int, в которую будет скопировано значение переменной типа int, на которую указывает указатель или ссылка. Эту временную переменную затем можно будет скопировать в другую переменную типа int.

Пример исправления исключения:

```csharp
ParameterExpression sourceParam = Expression.Parameter(typeof(int), "source");
ParameterExpression targetParam = Expression.Parameter(typeof(int), "target");

ParameterExpression tempParam = Expression.Variable(typeof(int), "temp");

var copyTempExpr = Expression.Assign(tempParam, sourceParam);
var copyExpr = Expression.Assign(targetParam, tempParam);

var block = Expression.Block(
    new[] { tempParam },
    copyTempExpr,
    copyExpr
);

var lambda = Expression.Lambda<Action<int, int>>(block, sourceParam, targetParam).Compile();

int sourceValue = 10;
int targetValue = 0;

lambda(sourceValue, targetValue);

Console.WriteLine(targetValue); // Выведет 10
```
Нашёл альтернативу. Вместо MemoryMarshal.Cast использовать MemoryMarshal.Read
Похожие вопросы