2013-08-08 2 views
6

У меня есть класс с именем BaseRobot:Невозможно изменить возвращаемое значение, поскольку она не является переменной

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

Именно здесь создается оригинальный дом, я хотел создать новый дом в program.cs. У меня есть следующий код, но он не работает, появляется ошибка:

Невозможно изменить возвращаемое значение, потому что это не переменная.

Код:

 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()); 
      } 

Как присвоить новые значения х и Y?

+5

@MitchWheat и другие ребята. Это не дубликат, вы должны попробовать прочитать оба вопроса – musefan

+0

Что такое объявление и пространство имен вашей «точки»? –

ответ

2

Вы должны добавить set аксессор к Home собственности:

private Point mHome; 
    public Point Home 
    { 
     get { return mHome; } 
     set { mHome = value; } 
    } 
+5

Это само по себе не решит проблему – musefan

19

Вы должны установить Home свойство непосредственно, как правило, лучше, чтобы создать новый объект Point ...

robot2.Home = new System.Drawing.Point(1, 5);//x, y 

Кроме того, чтобы вам было необходимо применить аксессор set к вашему Home ...

public Point Home 
{ 
    get { return mHome; } 
    set { mHome = value; } 
} 

Если вы хотите узнать больше информации о том, почему компилятор не позволит вам assignthe значения непосредственно к X собственности, а затем проверить несколько из answers over here

+0

Я сделал это, но теперь получаю сообщение в основной программе, говоря, что «Точка» не найдена – user2657462

+0

@ user2657462: Тогда у вас, вероятно, нет правильного пространства имен. Либо добавьте его специально при создании нового «Точка» (см. Мое редактирование). Или включите его в начало файла вашего класса: 'include System.Drawing;' (или используйте «Resolve» в VS) – musefan

+1

Да, это так очевидно, когда вы видите его снова в десятый раз. В любом случае +1. У вас есть еще один значок хорошего ответа. – ouflak

2

System.Drawing.Point является типом значения, что означает ваше имущество Home возвращает копию частного mHome, а не ссылку на него.

Вы должны добавить сеттера для дома собственности и настроить свой код:

private Point mHome; 
    public Point Home 
    { 
     get { return mHome; } 
     set {mHome = value;} 
    } 

регулировочного код вызова, чтобы назначить новую точку на главную страницу:

robot2.Home = new Point(1, 5); 
5

You придется изменить свой код так:

private Point mHome; 

public Point Home 
{ 
    get { return mHome; } 
    set { mHome = value; } 
} 

и установить его так:

robot2.Home = new Point(1, 5); 

Структуры неизменяемы, поэтому изменение значения фактически возвращает новый экземпляр Point, но ваша собственность не имеет сеттера.

+1

+1 для обозначения того, что структуры неизменяемы. Не упоминалось в верхней голосовой почте, что важно знать, почему код в открытии сообщения не работает – Tseng

+2

Структуры не являются неизменяемыми, они имеют семантику значений. Вы можете изменить локальную переменную или поле типа структуры, если оно специально не предназначено для неизменяемости. –

0

Его предположение, но свойства X и Y, вероятно, являются только геттерами, такими как собственность вашего дома.

Есть ли функция в вашем классе роботов для перемещения позиции ??? Используйте это.если не обеспечить полный пример пожалуйста

+0

Не забывайте, что если вы поймете, что после того, как вы опубликовали другой ответ (это лучше или то же самое), вы уже отправили сообщение, поэтому вам не нужно удалять сообщение, чтобы избежать проблем с ответами, которые ничего не добавляют. – Michelle

1

Помимо уже упомянутого решения, чтобы сделать публичной собственности сеттера, вы можете также:

Создание присваиватели public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }

Expose поле общественного public Point Home; Примечание: выставление поданной как общедоступной обычно считается не лучшим решением. Но может быть удобно в некоторых ситуациях.

1

я встретил где-то это хорошее объяснение (я адаптировать его для этого данного случая):

Это плохая часть C# дизайна.

Внутри такие вещи, как robot2.Home реализуется как свойства, поэтому при попытке присвоить значение Home.X, получать-функция Home вызывается под капотом (и это где "Невозможно изменить возвращаемое значение .. "идет от). Когда это будет сделано, вы не сможете назначить в отдельный член (X) структуры Point, но должны назначить всю структуру.

Таким образом, в C#, вам нужно прочитать значение из в Point, а затем изменить его:

robot2.Home = robot2.Home + new Point (deltaX, deltaY); 

Или (если мы не заинтересованы в предыдущем значении (как в данном случае)) просто назначить это новый:

robot2.Home = new Point (1f, 5f); 

PS: конечно, вы также должны добавить сеттера для дома собственности (как уже упоминалось в других ответах).

Смежные вопросы