Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot modify the return value because it is not a variable

Tags:

c#

oop

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?

like image 772
user2657462 Avatar asked Aug 08 '13 12:08

user2657462


3 Answers

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

like image 92
musefan Avatar answered Nov 13 '22 04:11

musefan


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.

like image 7
gzaxx Avatar answered Nov 13 '22 05:11

gzaxx


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).

like image 5
user1234567 Avatar answered Nov 13 '22 04:11

user1234567