@SergeySerge11

Как получить unsafe delegate из обычного делегата? В чем ошибка?

В чем ошибка, почему в метод передается null значение ref myStruct==null?
internal class MainClass1
{
    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
        public int x;
        public int count;

    }
    delegate void F(ref MyStruct s);
    static F d; 
    static unsafe delegate*<ref MyStruct, void> createUnsafe(ref MyStruct s1, int x)
    {   
      //var d; 
       d = (ref MyStruct s) =>
        {
           // s == null ???
           // x  случайное число, а не переданное
            s.x = x;  
            Console.WriteLine(s .x );  
        }; 
// return (delegate*unmanaged<ref MyStruct, void>)Marshal.GetFunctionPointerForDelegate(d); туда же
        return (delegate*<ref MyStruct, void>)d.Method.MethodHandle.GetFunctionPointer();
    } 
    unsafe static void Main()
    {
        MyStruct myStruct = new MyStruct();
        var d = createUnsafe(ref myStruct, 100);
        d(ref myStruct);
    }
}
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
У тебя делегат твой с замыканием, а GetFunctionPointer возвращает указатель на функцию.
=> Делегат хочет обратиться к замыканию (`this.x`), а его нет.
Да и тк там this, то ещё в качестве первого аргумента должна вроде идти ссылка на экземпляр объекта-делегата.

Ну и unsafe delegate* - не делегат, а указатель на функцию по сути своей (уже настоящий)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы