我来自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]
解决方案是什么?
答案 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];