C# ref возвращает ref return

Я пытаюсь создать метод, возвращающий другой ref returnметод, но не может заставить его работать, если методы принимают ref параметр

Вот пример кода:

      public class TestRef
{
    public int storage=42;


    public ref int Get(ref bool someParam)
    {
        return ref this.storage;
    }

    public ref int Get2(bool someParam)
    {
        var someParam2 = someParam;
        ref var result =ref Get(ref someParam2);

        return ref result;
    }

}

При этом внизу появляется следующая ошибка return ref result; линия: Error CS8157 Cannot return 'result' by reference because it was initialized to a value that cannot be returned by reference

Однако этот код работает:

      public class TestRef
{
    public int storage=42;


    public ref int Get()
    {
        return ref this.storage;
    }

    public ref int Get2()
    {
        ref var result =ref Get();
        return ref result;
    }

}

Что я здесь делаю не так? Как мне вернуть результат по ссылке?

1 ответ

Решение

что «реф возвращает» (C# 7.0) чемпионские ссылки на эту статью в которой перечислены следующие «безопасно вернуться» правила:

  • ссылки на переменные в куче можно безопасно вернуть
  • параметры ref можно безопасно вернуть
  • параметры out безопасны для возврата (но должны быть определенно назначены, как это уже имеет место сегодня)
  • Поля структуры экземпляра безопасно возвращать, пока получатель может безопасно возвращать
  • «This» небезопасно возвращать из членов структуры
  • ссылка, возвращенная из другого метода, безопасна для возврата, если все ссылки / выходы, переданные этому методу в качестве формальных параметров, можно было безопасно вернуть.

Ваш код нарушает последний - вызвать локальную переменную someParam2возвращаться небезопасно. Либо сделай Get принимая bool someParam или сделать someParam из Get2 ref bool и удалите локальное присвоение ( ref var someParam2 = ref someParam; тоже будет работать):

      public ref int Get2(ref bool someParam)
{
    ref var result = ref Get(ref someParam);

    return ref result;
}
Другие вопросы по тегам