无法修改返回值,因为它不是变量
本文关键字:变量 因为 修改 返回值 | 更新日期: 2023-09-27 18:26:49
我有一个名为BaseRobot
:的类
var robot2 = new BaseRobot(0, 0, 0);
private Point mHome;
public Point Home
{
get { return mHome; }
}
这就是创建原始住宅的地方,我想在program.cs
中创建一个新住宅。我有以下代码,但它不起作用,它出现了一个错误,说
无法修改返回值,因为它不是变量。
代码:
robot2.Home.X = 1
robot2.Home.Y = 5;
{
Console.WriteLine("===New robot at specified home position===");
StringBuilder ab = new StringBuilder();
ab.AppendFormat("Robot#2 has home at <{0},{0}>.'r'n ", robot2.Home.X, robot2.Home.Y);
ab.AppendFormat("It is facing {0} ", robot2.Orientation);
ab.AppendFormat("and is currently at <{0},{0}>.'r'n", robot2.Position.X, robot2.Position.Y);
Console.WriteLine(ab.ToString());
}
如何为x和Y指定新值?
您需要直接设置Home
属性,通常最好是创建一个新的Point
对象。。。
robot2.Home = new System.Drawing.Point(1, 5);//x, y
此外,为了允许对Home
属性应用set
访问器。。。
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
如果您想了解编译器为什么不允许您将值直接分配给X
属性的更多信息,请检查此处的一些答案
您必须这样更改代码:
private Point mHome;
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
并将其设置为:
robot2.Home = new Point(1, 5);
结构是不可变的,所以更改值实际上会返回新的Point
实例,但您的属性并没有setter。
我在某个地方遇到了这样一个很好的解释(我会根据当前的情况进行调整):
这是C#设计中不好的部分。
在内部,像robot2.Home
这样的东西是作为属性实现的,所以当你试图给Home.X
赋值时,Home
的get函数会在后台被调用(这就是"Cannot modify the return value of.."的来源)。完成此操作后,不能将Point
结构的单个成员(X
)赋值,而必须将整个结构赋值。
因此,在C#中,您需要将值读取到Point
中,然后对其进行修改:
robot2.Home = robot2.Home + new Point (deltaX, deltaY);
或者(如果我们对以前的值不感兴趣(如本例)),只需将其分配给新值:
robot2.Home = new Point (1f, 5f);
PS:当然,您还需要为Home属性添加一个setter(正如其他答案中提到的那样)
您需要向Home
属性添加一个set
访问器:
private Point mHome;
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
System.Drawing.Point
是一个值类型,这意味着您的Home
属性返回私有mHome
的副本,而不是对它的引用。
您必须为Home属性添加一个setter,并将代码调整为:
private Point mHome;
public Point Home
{
get { return mHome; }
set {mHome = value;}
}
调整您的呼叫代码以将新点分配给主页:
robot2.Home = new Point(1, 5);
除了前面提到的制作公共属性setter的解决方案之外,您还可以:
创建setter方法
public void SetHomeX(double x) { mHome.X = x; }
public void SetHomeY(double y) { mHome.Y = y; }
将字段公开
public Point Home;
注意:将文件公开为公共文件通常被认为不是一个好的解决方案。但在某些情况下可能很方便。
这是一个很好的猜测,但属性X和Y可能只是getter,就像Your Home属性一样。
你的机器人类中有移动位置的功能吗??使用它。如果没有提供完整的示例,请