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

时间:2013-08-08 12:40:26

标签: c# oop

我有一个名为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分配新值?

7 个答案:

答案 0 :(得分: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属性,请查看answers over here

中的一些内容。

答案 1 :(得分:6)

您必须像这样更改代码:

private Point mHome;

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

并将其设置为:

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

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

答案 2 :(得分:3)

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

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

在内部,像robot2.Home这样的东西是作为属性实现的,所以当你尝试为Home.X赋值时,Home的get函数会在引擎盖下调用(这是其中“无法修改.. 的返回值”来自)。完成此操作后,您无法分配到X结构的单个成员(Point),但必须分配整个结构。

所以在C#中,你需要将值读出到Point然后修改它:

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

或者(如果我们对以前的值不感兴趣(如本例所示)),只需将其分配给新的:

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

PS:当然,您还需要为Home属性添加一个setter(如其他答案中所述)。

答案 3 :(得分:2)

您需要向set属性添加Home访问者:

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

答案 4 :(得分:2)

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);

答案 5 :(得分:1)

除了已经提到的制作公共财产制定者的解决方案之外,您还可以:

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

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

答案 6 :(得分:0)

这是一个猜测,但属性X和Y可能只是吸气剂,如你的房产。

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