我有一个叫做的课BaseRobot:
var robot2 = new BaseRobot(0, 0, 0);
private Point mHome;
public Point Home
{
get { return mHome; }
}
Run Code Online (Sandbox Code Playgroud)
这就是创造原始住宅的地方,我想在这里创建一个新家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());
}
Run Code Online (Sandbox Code Playgroud)
如何为x和Y分配新值?
mus*_*fan 20
您需要Home直接设置属性,通常最好创建一个新Point对象...
robot2.Home = new System.Drawing.Point(1, 5);//x, y
Run Code Online (Sandbox Code Playgroud)
此外,为了允许您需要set为您的Home财产申请一个访问者......
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
Run Code Online (Sandbox Code Playgroud)
如果你想了解一些更多的信息,为什么编译器不会让你直接赋予X属性值,那么在这里查看一些答案
您必须像这样更改代码:
private Point mHome;
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
Run Code Online (Sandbox Code Playgroud)
并设置如下:
robot2.Home = new Point(1, 5);
Run Code Online (Sandbox Code Playgroud)
结构是不可变的,因此更改值实际上返回新Point实例,但您的属性没有setter.
我在某个地方遇到过这个很好的解释(我将针对当前情况对其进行调整):
这是 C# 设计的一个糟糕部分。
在内部,像这样的东西robot2.Home是作为属性实现的,所以当你尝试为 分配一个值时Home.X,会在Home后台调用一个 get 函数(这就是“无法修改 .. 的返回值”的来源)。完成此操作后,您无法将其分配给单个成员 ( X)Point,而必须分配整个结构。
所以在 C# 中,你需要将值读入 aPoint然后修改它:
robot2.Home = robot2.Home + new Point (deltaX, deltaY);
Run Code Online (Sandbox Code Playgroud)
或者(如果我们对以前的值不感兴趣(在这种情况下))只需将其分配给新值:
robot2.Home = new Point (1f, 5f);
Run Code Online (Sandbox Code Playgroud)
PS:当然,您还需要为 Home 属性添加一个 setter(如其他答案中所述)。
您需要set向该Home属性添加一个访问器:
private Point mHome;
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24761 次 |
| 最近记录: |