我试图使一个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;
}
}
我在这里做错了什么?我如何通过引用返回结果?
the "(c# 7.0)冠军链接到这篇文章,其中列出了下一个"安全返回";规则:
- 引用堆上的变量是安全的返回
- ref参数返回 是安全的
- 输出参数可以安全返回(但必须明确赋值,就像今天的情况一样) 只要接收者能够安全返回,
- 实例结构字段就可以安全返回。
- 从结构成员 返回" this "不安全如果作为形式参数传递给该方法的所有ref/out都可以安全返回,则从另一个方法返回的ref是安全的。
您的代码违反了最后一条—因为返回局部变量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);
}
做一些非常错误的事情。