6

我有一堂课叫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 分配新值?

4

7 回答 7

20

您需要Home直接设置属性,通常最好创建一个新Point对象...

robot2.Home = new System.Drawing.Point(1, 5);//x, y

此外,为了允许您需要对set您的Home属性应用访问器...

public Point Home
{
    get { return mHome; }
    set { mHome = value; }
}

如果您想了解有关编译器为何不允许您将值直接分配给X属性的更多信息,请在此处查看一些答案

于 2013-08-08T12:42:59.827 回答
7

您必须像这样更改代码:

private Point mHome;

public Point Home
{
   get { return mHome; }
   set { mHome = value; }
}

并将其设置为:

robot2.Home = new Point(1, 5);

结构是不可变的,因此更改值实际上会返回新Point实例,但您的属性没有设置器。

于 2013-08-08T12:44:09.307 回答
5

我在某个地方遇到了这个很好的解释(我会根据当前的情况对其进行调整):

这是 C# 设计的一个坏部分。

在内部,类似的东西robot2.Home被实现为属性,因此当您尝试为 赋值时Home.X,会在后台调用一个 get 函数Home(这就是“无法修改 .. 的返回值”的来源)。完成后,您不能分配给结构的单个成员 ( X) Point,而必须分配整个结构。

因此在 C# 中,您需要将值读入 a 中Point,然后对其进行修改:

robot2.Home = robot2.Home + new Point (deltaX, deltaY);

或者(如果我们对以前的值不感兴趣(在这种情况下))只需将其分配给新的值:

robot2.Home = new Point (1f, 5f);

PS:当然,您还需要为 Home 属性添加一个设置器(正如其他答案中提到的那样)。

于 2016-12-22T11:21:25.700 回答
2

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

   private Point mHome;
   public Point Home
   {
       get { return mHome; }
       set { mHome = value; }
   }
于 2013-08-08T12:42:26.320 回答
2

System.Drawing.Point是一种值类型,这意味着您的Home属性正在返回private的副本mHome,而不是对它的引用。

您必须为 Home 属性添加一个设置器并将您的代码调整为:

  private Point mHome;
  public Point Home
  {
      get { return mHome; }
      set {mHome = value;}
  }

调整您的呼叫代码以将新点分配给 Home:

   robot2.Home = new Point(1, 5);
于 2013-08-08T12:43:47.477 回答
1

除了已经提到的创建公共属性设置器的解决方案之外,您还可以:

创建设置方法 public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }

将字段公开为公共 public Point Home; 注意:将字段公开为公共通常被认为不是一个好的解决方案。但在某些情况下可能很方便。

于 2015-08-07T08:09:31.297 回答
0

这是一个随意的猜测,但属性 X 和 Y 可能只是吸气剂,比如 Your Home 属性。

您的机器人类中是否有移动位置的功能?用那个。如果没有提供完整的例子,请

于 2013-08-08T12:45:03.353 回答