属性 上的 C# 7 Ref return 无法编译
C# 7 Ref return on a property doesn't compile
在学习 c# 7 时,我偶然发现了 Ref return。下面的 GetSingle 方法有效,因为我了解到 return 我是外部参考。但是 GetIns 方法抛出一个编译时错误。不幸的是,我无法弄清楚这些 GetIns 与 GetSingle 不同的原因和方式。有人可以解释一下吗?
错误:不能在此上下文中使用表达式,因为它可能不是 return 引用。
请注意,其中一条评论建议将其作为重复项。但那个问题是集合的类型,这特别是在集合成员和类型中的 属性 之间。因此我认为这是一个不同的问题
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 字段成员。您不能 return 引用属性。
这不会编译:
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# 7 时,我偶然发现了 Ref return。下面的 GetSingle 方法有效,因为我了解到 return 我是外部参考。但是 GetIns 方法抛出一个编译时错误。不幸的是,我无法弄清楚这些 GetIns 与 GetSingle 不同的原因和方式。有人可以解释一下吗?
错误:不能在此上下文中使用表达式,因为它可能不是 return 引用。
请注意,其中一条评论建议将其作为重复项。但那个问题是集合的类型,这特别是在集合成员和类型中的 属性 之间。因此我认为这是一个不同的问题
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 字段成员。您不能 return 引用属性。
这不会编译:
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;
}