返回对list元素的引用,以便为其赋值

时间:2018-06-04 10:52:08

标签: c#

我来自C ++背景,这里有一个简单的问题。我有以下列表作为类成员:

public enum FieldColor {Empty, Blue, White};
private List<List<FieldColor>> m_board = new List<List<FieldColor>>();

现在我有这么简单的方法:

private FieldColor GetFieldColor(GridCoordinates coordinates) {
    return m_board[coordinates.row][coordinates.column];
}

现在我想使用此方法为coordinate赋值,我写了这个:

    GetFieldColor(coordinates) = color;

我收到了这个错误:

  

作业的左侧必须是变量,属性或   indexer [Assembly-CSharp]

解决方案是什么?

3 个答案:

答案 0 :(得分:4)

您始终可以使用Ref return

  

从C#7.0开始,C#支持引用返回值(ref   回报)。引用返回值允许方法返回a   将变量而不是值引用回调用者。该   然后,调用者可以选择将返回的变量视为处理   按值或按引用返回。调用者可以创建一个新的   变量本身是对返回值的引用,称为   ref local。

<强>限制

  

方法可以返回的表达式有一些限制   作为参考回报值。限制包括:

     
      
  • 返回值的生命周期必须超出方法的执行范围。换句话说,它不能是局部变量   在返回它的方法中。它可以是实例或静态字段   一个类,或者它可以是传递给该方法的参数。尝试   返回一个局部变量生成编译器错误CS8168,“不能   通过引用返回本地'obj',因为它不是ref本地。“

  •   
  • 返回值不能是文字null。返回null会生成编译器错误CS8156,“表达式不能用于此   上下文,因为它可能不会被引用返回。“

  •   
  • 带有ref返回的方法可以将别名返回到其值当前为null(未实例化)值或可空类型的变量   对于值类型。

  •   
  • 返回值不能是常量,枚举成员,属性的按值返回值,或类的方法或   结构。违反此规则会生成编译器错误CS8156,“An   表达式不能在此上下文中使用,因为它可能不是   通过引用返回。“

  •   

示例

private ref int GetFieldColor(GridCoordinates coordinates)
{
    return ref m_board[coordinates.row][coordinates.column];
}

有效使用

GetFieldColor(gridCoordinates) = 345;

或者您可以使用indexer

  

索引器允许对类或结构的实例进行索引   阵列。可以在没有显式的情况下设置或检索索引值   指定类型或实例成员。索引器类似于属性   除了他们的访问者采用参数。

public int this[GridCoordinates coordinates]
{
   get => m_board[coordinates.row][coordinates.column];
   set => m_board[coordinates.row][coordinates.column] = value;
}

<强>用法

this[GridCoordinates] = 345

答案 1 :(得分:2)

您需要为同一个

创建单独的setter方法
private FieldColor SetFieldColor(GridCoordinates coordinates, FieldColor color) {
    m_board[coordinates.row][coordinates.column] = color;
}

答案 2 :(得分:1)

您还可以重载[]运算符以满足您的需求。我发现这种方法比C#哲学中的ref return和更多的方法更为晦涩。

public FieldColor this[int row, int column]
{
    get => m_board[row][column];
    set => m_board[row][column] = value;
}

如果需要,使用前一个的第二个重载:

public FieldColor this[GridCoordinates coordinates]
{
    get => this[coordinates.row, coordinates.column];
    set => this[coordinates.row, coordinates.column] = value;
}

用法:

field[0, 1] = FieldColor.Empty;
var color = field[0, 1];