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

我有一个名为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 .\r\n ", robot2.Home.X, robot2.Home.Y); ab.AppendFormat("It is facing {0} ", robot2.Orientation); ab.AppendFormat("and is currently at .\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 

此外,为了允许您需要将一个set访问器应用于您的Home属性…

 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。

您需要为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;} } 

调整您的调用代码以将新点指定给Home:

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

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

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

将该领域公开为公共 public Point Home; 注意:将文件公开为公开通常被认为不是一个好的解决方案。 但在某些情况下可能会派上用场。

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

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

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

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

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

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

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

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

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

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