【问题标题】:How do I enforce readonlyness of ref readonly in C# 7.2?如何在 C# 7.2 中强制 ref readonly 的只读性?
【发布时间】:2018-05-23 15:05:59
【问题描述】:

我想写一个方法返回 ref a ref readonly as described: "该功能允许成员通过引用返回变量而不会将它们暴露于突变。"

不幸的是,我的代码编译并进行了这样的突变。如何确保无法修改?它是只读的,有充分的理由。我预计会出现编译器错误。我应该做些什么吗? 200被修改为201。我不想要那个。

internal class TryClass
{
    private static int _result = 0;

    public static ref readonly int Multiply(int a, int b)
    {
        _result = a * b;
        return ref _result;
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
        int x = 10;
        int y = 20;
        var rez = TryClass.Multiply(x, y);
        rez++;
        Console.WriteLine(rez);
        Console.ReadLine();
    }
}

【问题讨论】:

  • @MethodMan 我相信你没有完全阅读 c# 7.2 中新的ref readonly 语法
  • 您忘记了TryClass.Multiply 之前的ref 关键字(以及var rez 之前的相应ref readonly),从而导致它返回一个副本,而不是只读引用:docs.microsoft.com/en-us/dotnet/csharp/…跨度>

标签: c# c#-7.2


【解决方案1】:

基于 cmets。这就是解决方案。我得到了我期望的编译器错误:“严重性代码描述项目文件行抑制状态 错误 CS8329 无法使用方法 'TryClass.Multiply(int, int)' 作为 ref 或 out 值,因为它是只读变量”

internal class Program
{
    private static void Main(string[] args)
    {
        int x = 10;
        int y = 20;
        ref readonly var rez = ref TryClass.Multiply(x, y);
        rez++;
        Console.WriteLine(rez);
        TryClass.DoAfter();
        Console.ReadLine();
    }
}

【讨论】:

  • ref var rez 应该是 ref readonly var rez(这应该会导致不同的编译错误)
  • 做什么?我的只读是强制执行的。 "rez++" 导致编译器错误。
  • 您是否尝试在此代码示例中注释掉rez++?它仍然会导致编译错误
  • 是的!这正是我想要的。通过在进行突变时获得编译器错误来强制只读
  • 他想说的是你的编译错误不在突变上,它在它上面的那一行。完全删除突变,您将得到相同的编译错误。您的行应该看起来像ref readonly var = ref TryClass.Multiply(x,y); 然后编译错误将更改为您实际期望的错误。
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多