无法修改返回值,因为它不是变量

use*_*462 6 c# oop

我有一个叫做的课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属性值,那么在这里查看一些答案


gza*_*axx 6

您必须像这样更改代码:

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.

  • 结构不是不可变的,它们具有值语义.您可以修改局部变量或结构类型的字段,除非它专门设计为不可变的. (3认同)

use*_*567 5

我在某个地方遇到过这个很好的解释(我将针对当前情况对其进行调整):

这是 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(如其他答案中所述)。


wee*_*oid 2

您需要set向该Home属性添加一个访问器:

   private Point mHome;
   public Point Home
   {
       get { return mHome; }
       set { mHome = value; }
   }
Run Code Online (Sandbox Code Playgroud)