C# ref return 一个 ref return

C# ref return a ref return

我正在尝试创建一个 ref return 方法,该方法 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;
    }

}

我在这里做错了什么?我怎样才能 return 通过引用得到结果?

"ref returns" (C# 7.0) champion links to this article 列出下一个“对 return 安全”的规则:

  • 对堆上变量的引用对 return
  • 是安全的
  • ref 参数对 return
  • 是安全的
  • out 参数对 return 是安全的(但必须明确分配,今天已经是这种情况)
  • 实例结构字段对 return 是安全的,只要接收者对 return
  • 是安全的
  • 结构成员
  • 的return“this”不安全
  • 如果作为正式参数传递给该方法的所有 refs/outs 对 return 都是安全的,return 来自另一个方法的引用对 return 是安全的。 30=]

您的代码违反了最后一条 - 导致局部变量 someParam2 对 return 不安全。使 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;
}