Cannot modify the return value because it is not a variable

前端 未结 7 1739
庸人自扰
庸人自扰 2020-12-11 19:27

I have a class called BaseRobot:

  var robot2 = new BaseRobot(0, 0, 0);
  private Point mHome;
  public Point Home
  {
      get { return mHome;         


        
相关标签:
7条回答
  • 2020-12-11 19:32

    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.

    0 讨论(0)
  • 2020-12-11 19:33

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

    0 讨论(0)
  • 2020-12-11 19:47

    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);
    
    0 讨论(0)
  • 2020-12-11 19:47

    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.

    0 讨论(0)
  • 2020-12-11 19:49

    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

    0 讨论(0)
  • 2020-12-11 19:53

    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

    0 讨论(0)
提交回复
热议问题