I have a class called BaseRobot
:
var robot2 = new BaseRobot(0, 0, 0);
private Point mHome;
public Point Home
{
get { return mHome; }
}
That is where the original home is created, I am wanting to create a new home in the program.cs
. I have the following code but it does not work, it is coming up with an error saying
Cannot modify the return value becasue it is not a variable.
Code:
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());
}
How do you assign new values to x and Y?
You need to set the Home
property directly, usually best to create a new Point
object...
robot2.Home = new System.Drawing.Point(1, 5);//x, y
Also, in order to allow that you need to apply a set
accessor to your Home
property...
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
If you want to find out some more information of why the compiler won't let you assignthe value directly to the X
property, then check a few of the answers over here
You have to change your code like this:
private Point mHome;
public Point Home
{
get { return mHome; }
set { mHome = value; }
}
and set it like this:
robot2.Home = new Point(1, 5);
Structs are immutable so changing value in fact returns new Point
instance but your property do not have setter.
I've met somewhere this good explanation (I'll adapt it for this current case):
It's a bad part of the C# design.
Internally, stuff like robot2.Home
is implemented as properties, so when you try assign a value to Home.X
, a get-function for Home
gets called under the hood (and this is where "Cannot modify the return value of .." goes from). When this is done, you can't assign into an individual member (X
) of the Point
struct, but have to assign the entire struct.
So in C#, you need to read the value out into a Point
and then modify it:
robot2.Home = robot2.Home + new Point (deltaX, deltaY);
Or (if we don't interested in previous value (as in this case)) just assign it to new one:
robot2.Home = new Point (1f, 5f);
PS: Of course, you also need to add a setter for the Home property (as it is mentioned in other answers).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With