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