编程语言
首页 > 编程语言> > C#7对属性的Ref返回不编译

C#7对属性的Ref返回不编译

作者:互联网

参见英文答案 > Why doesn’t returning by ref work for elements of collections?                                    2个
在学习c#7时,我碰巧偶然发现Ref返回.下面的GetSingle方法在我学到的时候起作用,它在外面给我一个引用.但GetIns方法抛出了编译时错误.不幸的是,我无法解释为什么以及这些GetIns如何与GetSingle不同.有人可以解释一下吗?

错误:表达式不能在此上下文中使用,因为它可能不是通过引用返回的.

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

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

解决方法:

这是因为Shape具有属性Area而不是public 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;
}

标签:c,c-7-0
来源: https://codeday.me/bug/20190608/1197039.html