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
,而不是被引用的对象