Lamda Expression. Работа с ref
От: SanyaVB  
Дата: 27.02.24 19:18
Оценка:
Не пойму как написать Expression такого куска кода:
  ref float result0 = ref MemoryMarshal.GetArrayDataReference(anyFloatArray);
  ref float result1 = ref Unsafe.Add(ref result0, 0);


или такого

return (t1, t2) => {
    ref float result0 = ref MemoryMarshal.GetArrayDataReference(t1.data);
    ref float result1 = ref Unsafe.Add(ref result0, 0);

    return result1;
};



У меня получилось вот такое

 var getArrayDataReference 
    = typeof(MemoryMarshal).GetMethods().First(x => x.Name == "GetArrayDataReference" && x.IsGenericMethod).MakeGenericMethod(typeof(float)); // {Single& GetArrayDataReference[Single](Single[])}

 var unsafe_Add = typeof(Unsafe).GetMethods().First(x => x.Name == "Add" && x.IsGenericMethod).MakeGenericMethod(typeof(float)); // тут получаю Single& Add[Single](Single ByRef, Int32)
           
 var result0 = Expression.Call(getArrayDataReference, [anyFloatArray]);  // тут все OK   

 var result1 = Expression.Call(unsafe_Add, [result0, Expression.Constant(0)]); // System.ArgumentException: "Expression of type 'System.Single&' cannot be used
                                                                               // for parameter of type 'System.Single' of method 'Single& Add[Single](Single ByRef, Int32)' Arg_ParamName_Name"


Подскажите, как исправить ошибку?
Отредактировано 27.02.2024 19:50 SanyaVB . Предыдущая версия .
Re: Lamda Expression. Работа с ref
От: _NN_ www.nemerleweb.com
Дата: 28.02.24 09:03
Оценка: +1
Здравствуйте, SanyaVB, Вы писали:

По документации в дерево выражений нельзя такой код вставить.
Нужны обходные пути

"CS8153 — An expression tree lambda may not contain a call to a method, property, or indexer that returns by reference."

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/expression-tree-restrictions
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.