Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法修改返回值,因为它不是变量_C#_Oop - Fatal编程技术网

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

C# 无法修改返回值,因为它不是变量,c#,oop,C#,Oop,我有一个叫做BaseRobot的类: var robot2 = new BaseRobot(0, 0, 0); private Point mHome; public Point Home { get { return mHome; } } 这就是创建原始主页的地方,我想在程序.cs中创建一个新主页。我有下面的代码,但它不工作,它会出现一个错误,说 无法修改返回值,因为它不是变量 代码: robot2.Home.X=1 机器人2.Home.Y=5; { Cons

我有一个叫做
BaseRobot
的类:

  var robot2 = new BaseRobot(0, 0, 0);
  private Point mHome;
  public Point Home
  {
      get { return mHome; }
  }
这就是创建原始主页的地方,我想在
程序.cs
中创建一个新主页。我有下面的代码,但它不工作,它会出现一个错误,说

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

代码:

robot2.Home.X=1
机器人2.Home.Y=5;
{
Console.WriteLine(“==指定起始位置的新机器人===”;
StringBuilder ab=新的StringBuilder();
ab.AppendFormat(“Robot#2的home at.\r\n”,robot2.home.X,robot2.home.Y);
ab.AppendFormat(“它面向{0}”,robot2.Orientation);
ab.AppendFormat(“当前处于。\r\n”,robot2.Position.X,robot2.Position.Y);
Console.WriteLine(ab.ToString());
}

如何将新值分配给x和Y?

您需要向
主属性添加
设置
访问器:

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

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

robot2.Home = new System.Drawing.Point(1, 5);//x, y
此外,为了允许访问,您需要将
设置
访问者应用于
主页
属性

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


如果您想了解编译器为什么不允许您将值直接分配给
X
属性的更多信息,请检查一些
系统。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);

您必须按如下方式更改代码:

private Point mHome;

public Point Home
{
   get { return mHome; }
   set { mHome = value; }
}
robot2.Home = new Point(1, 5);
设置如下:

private Point mHome;

public Point Home
{
   get { return mHome; }
   set { mHome = value; }
}
robot2.Home = new Point(1, 5);

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

这是一个很好的猜测,但是属性X和Y可能只是getter,就像您的Home属性一样


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

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

创建setter方法

public void SetHomeX(double x){mHome.x=x;}
public void SetHomeY(双y){mHome.y=y;}

将字段公开为公共字段

公共点之家;

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

我在某个地方遇到过这样一个好的解释(我将根据当前的情况进行调整):

这是C#设计中很糟糕的一部分

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

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

robot2.Home = robot2.Home + new Point (deltaX, deltaY);
或者(如果我们对以前的值不感兴趣(如本例所示))只需将其分配给新值:

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

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

不要忘记,如果您在发布后意识到另一个答案(更好或相同)已经发布,删除你的帖子是免费的,这样可以避免问题和答案变得杂乱无章。我已经这样做了,但是现在在主程序中收到一条消息,说“Point”不能被删除found@user2657462:那么您可能没有包含正确的命名空间。在创建新的
(请参见我的编辑)时,可以专门添加它。或者将其包含在类文件的顶部:
include System.Drawing(或在VS中使用“Resolve”)是的,当你第十次看到它时,这是非常明显的。无论如何+1。“还有一个好的回答徽章。”米奇麦和其他人。这不是重复的,您应该尝试实际阅读两个问题,即您的
点的声明和命名空间是什么?+1,以说明结构是不可变的。在排名靠前的帖子中没有提到,这一点很重要,要知道为什么开篇帖子中的代码不工作结构不是不变的,它们具有值语义。您可以修改局部变量或结构类型的字段,除非它是专门设计为不可变的。