C# 返回对列表元素的引用,以便能够为其赋值 我来自C++背景,这里有一个简单的问题。作为班级成员,我有以下清单: public enum FieldColor {Empty, Blue, White}; private List<List<FieldColor>> m_board = new List<List<FieldColor>>();

C# 返回对列表元素的引用,以便能够为其赋值 我来自C++背景,这里有一个简单的问题。作为班级成员,我有以下清单: public enum FieldColor {Empty, Blue, White}; private List<List<FieldColor>> m_board = new List<List<FieldColor>>();,c#,C#,现在我想用这个方法给坐标赋值,我写了这样一个: GetFieldColor(coordinates) = color; 我得到了这个错误: 赋值的左侧必须是变量、属性或 索引器[汇编CSharp] 解决办法是什么 您需要为相同的设置创建一个单独的setter方法 private FieldColor SetFieldColor(GridCoordinates coordinates, FieldColor color) { m_board[coordinates.row][co

现在我想用这个方法给坐标赋值,我写了这样一个:

    GetFieldColor(coordinates) = color;
我得到了这个错误:

赋值的左侧必须是变量、属性或 索引器[汇编CSharp]


解决办法是什么

您需要为相同的设置创建一个单独的setter方法

private FieldColor SetFieldColor(GridCoordinates coordinates, FieldColor color) {
    m_board[coordinates.row][coordinates.column] = color;
}
你可以随时使用

从C#7.0开始,C#支持参考返回值(参考 返回)。引用返回值允许方法返回 对变量而不是值的引用返回给调用方。这个 然后,调用方可以选择将返回的变量视为 通过值或引用返回。调用方可以创建一个新的 变量本身是对返回值的引用,称为 参考本地

限制

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

  • 返回值的生存期必须超过方法的执行时间。换句话说,它不能是局部变量 在返回它的方法中。它可以是实例或静态字段 类的参数,也可以是传递给方法的参数。企图 若要返回局部变量,将生成编译器错误CS8168,“无法” 通过引用返回本地“obj”,因为它不是本地引用。“

  • 返回值不能为文本null。返回null将生成编译器错误CS8156,“表达式不能在此过程中使用。” 上下文,因为它可能无法通过引用返回。“

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

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

示例

private ref int GetFieldColor(GridCoordinates coordinates)
{
    return ref m_board[coordinates.row][coordinates.column];
}
GetFieldColor(gridCoordinates) = 345;
this[GridCoordinates] = 345
有效用法

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

或者您可以使用

索引器允许对类或结构的实例进行索引,就像 数组。可以设置或检索索引值,而无需显式 指定类型或实例成员。索引器类似于属性 除了它们的访问器接受参数

用法

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

您还可以重载
[]
操作符以满足您的需要。我发现这种方法比
ref-return
更简单,更符合C#哲学

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

这个怎么样<代码>var correspondingBoardCell=GetFieldColor(坐标);对应的BoardCell=颜色@Narek不起作用,因为您正在修改引用
对应的BoardCell
,而不是被引用的对象