I have a class called BaseRobot
:
var robot2 = new BaseRobot(0, 0, 0);
private Point mHome;
public Point Home
{
get { return mHome;
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).
System.Drawing.Point
is a value type, meaning your Home
property is returning a copy of the private mHome
, rather than a reference to it.
You'll have to add a setter for the Home property and adjust your code to:
private Point mHome;
public Point Home
{
get { return mHome; }
set {mHome = value;}
}
The adjust your calling code to assign a new point to Home:
robot2.Home = new Point(1, 5);
Beside the already mentioned solution to make a public property setter, you may also:
Create setter methods
public void SetHomeX(double x) { mHome.X = x; }
public void SetHomeY(double y) { mHome.Y = y; }
Expose the field as public
public Point Home;
Note: exposing a filed as public is usually considered as not a nice solution. But may be handy in some situations.
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
Its a wil guess , but the property X and Y are probably only getters, like Your Home property.
Is there a function in your robot class to move the position?? Use that. if not provide full example please