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;
}