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,以说明结构是不可变的。在排名靠前的帖子中没有提到,这一点很重要,要知道为什么开篇帖子中的代码不工作结构不是不变的,它们具有值语义。您可以修改局部变量或结构类型的字段,除非它是专门设计为不可变的。