我正在尝试创建一个 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;
行看到以下错误:
错误 CS8157 无法通过引用返回“结果”,因为它被初始化为无法通过引用返回的值
但是这段代码可以工作:
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;
}
}
我在这里做错了什么?如何通过引用返回结果?
最佳答案
"ref returns" (C# 7.0) champion链接到this article其中列出了下一个“安全返回”规则:
- 对堆上变量的引用可以安全返回
- ref 参数可以安全返回
- 输出参数可以安全返回(但必须明确分配,就像今天的情况一样)
- 只要接收者可以安全返回,实例结构体字段就可以安全返回
- 从结构成员返回“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;
}
想象一下,如果 someParam
是一个 int
那么你可以这样做:
ref int Get(ref int i)
{
return ref i;
}
这将产生以下结果:
ref int Get2(...)
{
int local = 1;
return ref Get(ref local);
}
做了一些非常错误的事情。
关于C# ref 返回 ref 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69048638/