C# ref 返回 ref 返回

Jas*_*onS 2 c# .net-6.0 c#-10.0

我正在尝试创建一个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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这样做我在底线上看到以下错误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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Gur*_*ron 5

“ ref returns”(C# 7.0)冠军链接到本文,其中列出了下一个“安全返回”规则:

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

您的代码违反了最后一个 - 因为局部变量someParam2返回不安全。接受或删除本地分配(也可以)Getbool someParamsomeParamGet2 ref boolref var someParam2 = ref someParam;

\n
public ref int Get2(ref bool someParam)\n{\n    ref var result = ref Get(ref someParam);\n\n    return ref result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

想象一下如果someParam是那么int你可以做:

\n
ref int Get(ref int i)\n{\n     return ref i;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这将导致以下结果:

\n
ref int Get2(...)\n{\n     int local = 1; \n     return ref Get(ref local);\n} \n
Run Code Online (Sandbox Code Playgroud)\n

做一些非常错误的事情。

\n