【问题标题】:C# 7 Ref return on a property doesn't compile [duplicate]属性上的 C# 7 Ref 返回无法编译 [重复]
【发布时间】:2017-05-10 11:13:31
【问题描述】:

在学习 c# 7 时,我偶然发现了 Ref return。我了解到,下面的 GetSingle 方法有效,它返回给我一个外部参考。但是 GetIns 方法让我抛出编译时错误。不幸的是,我无法确定这些 GetInsGetSingle 有何不同以及有何不同。谁能解释一下?

错误:无法在此上下文中使用表达式,因为它可能不会通过引用返回。

请注意,其中一条评论建议将此作为重复。但是那个问题是集合的类型,这特别是在集合成员和类型中的属性之间。因此,我认为这是一个不同的问题

 class Pro
    {
        static void Main()
        {
            var x = GetSingle(new int[] { 1, 2 });
            Console.WriteLine(x);
        }
        static ref int GetSingle(int[] collection)
        {
            if (collection.Length > 0) return ref collection[0];
            throw new IndexOutOfRangeException("Collection Parameter!");
        }
        static ref int GetIns(Shape s)
        {
            if (s.Area <= 0)
            {
                s.Area = 200;
                return ref s.Area;
            }
            return ref s.Area;
        }
        struct Shape {public int Area{ get; set; }
    }

【问题讨论】:

  • 您不能获取属性的refShape.Area 是一个属性。如果您尝试将属性传递给接受ref/out 参数的方法(如int.TryParse("123", out s.Area)),也会发生同样的情况。
  • @DavidG,谢谢
  • Hence I see this as a different question - 这不是另一个问题的措辞相同,而是另一个问题的答案也完全回答了你的问题。因此它是重复的。
  • 请不要将您的问题作为重复关闭视为一件坏事。这仍然是一个有用的问题,因为它提出了一个略有不同的问题,它只是另一个问题的答案也涵盖了这个问题。有人在 SO 上搜索有关 ref 返回的详细信息,然后可能会找到您的并被定向到另一个问题以获得更多答案。

标签: c# c#-7.0


【解决方案1】:

这是因为 Shape 有一个 属性 区域而不是公共 int 字段成员。您不能返回对属性的引用。

这不会编译:

class Shape
{
  private int mArea;

  public int Area => mArea;
}

static ref int GetIns(Shape s)
{
  if (s.Area <= 0)
  {
    s.Area = 200;
    return ref s.Area;
  }
  return ref s.Area;
}

但这会:

class Shape
{
  public int Area;
}

static ref int GetIns(Shape s)
{
  if (s.Area <= 0)
  {
    s.Area = 200;
    return ref s.Area;
  }
  return ref s.Area;
}

【讨论】:

  • 根据文档,您是正确的。但是您将 Shape 重新实现为引用类型,它首先是值类型。这是否必须重新实施以达到所需的结果?你知道 struct 是如何实现同样的效果的吗?
猜你喜欢
  • 2018-07-28
  • 2013-07-07
  • 2018-06-26
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多