C# ref 返回 ref 返回

标签 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;
    }

}

执行此操作时,我在底部 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 ,要么让 someParamGet2 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/

相关文章:

c# - 使用 WebMatrix 中的缓存是用户特定的还是应用程序特定的?

.net-core - 使用 OData 8 设置自定义路线

c# - 将抽象方法重写为可为 null 的引用类型和值类型

c# - 如何从 WebMethod 访问全局变量?

c# - 使用 FFMPEG 进程从 rtsp 获取所有帧

c# - 使用 .Net6 Windows 10 在 Visual Studio Code for OmniSharp 上出错

c# - EF Core 6.0 无效操作异常 : The object has been removed from the model

C# 9/10 顶级语句和 ExcludeFromCodeCoverage-Attribute?

.net-6.0 - 如何激活 C# 10 功能 Visual Studio 2022

c# - Visual Studio 无法识别同一项目中的命名空间