c# ref返回一个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;
}
}

我在这里做错了什么?我如何通过引用返回结果?

the "(c# 7.0)冠军链接到这篇文章,其中列出了下一个"安全返回";规则:

  • 引用堆上的变量是安全的返回
  • ref参数返回
  • 是安全的
  • 输出参数可以安全返回(但必须明确赋值,就像今天的情况一样)
  • 只要接收者能够安全返回,
  • 实例结构字段就可以安全返回。
  • 从结构成员
  • 返回" this "不安全如果作为形式参数传递给该方法的所有ref/out都可以安全返回,则从另一个方法返回的ref是安全的。

您的代码违反了最后一条—因为返回局部变量someParam2是不安全的。要么让Get接受bool someParam,要么让someParam接受Get2ref bool,并删除本地分配(ref var someParam2 = ref someParam;也可以工作):

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

想象一下,如果someParamint,那么你可以:

ref int Get(ref int i)
{
return ref i;
}

将生成以下内容:

ref int Get2(...)
{
int local = 1; 
return ref Get(ref local);
} 

做一些非常错误的事情。

相关内容

最新更新