Impossible de modifier la valeur de retour car ce n’est pas une variable

J’ai une classe appelée BaseRobot :

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

C’est là que la maison d’origine est créée. Je souhaite créer une nouvelle maison dans le program.cs . J’ai le code suivant, mais cela ne fonctionne pas, il y a une erreur qui dit

Impossible de modifier la valeur de retour car il ne s’agit pas d’une variable.

Code:

  robot2.Home.X = 1 robot2.Home.Y = 5; { Console.WriteLine("===New robot at specified home position==="); SsortingngBuilder ab = new SsortingngBuilder(); ab.AppendFormat("Robot#2 has home at .\r\n ", robot2.Home.X, robot2.Home.Y); ab.AppendFormat("It is facing {0} ", robot2.Orientation); ab.AppendFormat("and is currently at .\r\n", robot2.Position.X, robot2.Position.Y); Console.WriteLine(ab.ToSsortingng()); } 

Comment atsortingbuez-vous de nouvelles valeurs à x et à Y?

Vous devez définir la propriété Home directement, il est généralement préférable de créer un nouvel object Point

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

Aussi, afin de permettre que vous deviez appliquer un accesseur set à votre propriété d’ Home

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

Si vous voulez en savoir plus sur les raisons pour lesquelles le compilateur ne vous laissera pas atsortingbuer la valeur directement à la propriété X , consultez quelques-unes des réponses ici

Vous devez changer votre code comme ceci:

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

et le mettre comme ceci:

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

Les structures étant immuables, la modification de valeur renvoie en fait une nouvelle instance de Point , mais votre propriété n’a pas de paramètre de définition.

Vous devez append un accesseur set à la propriété Home :

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

System.Drawing.Point est un type de valeur, ce qui signifie que votre propriété Home renvoie une copie du mHome privé plutôt qu’une référence à celui-ci.

Vous devrez append un séparateur pour la propriété Home et ajuster votre code pour:

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

Ajustez votre code d’appel pour atsortingbuer un nouveau point à la maison:

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

En plus de la solution déjà mentionnée pour créer un séparateur de propriétés publiques, vous pouvez également:

Créer des méthodes de public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; } public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }

Exposer le terrain comme public public Point Home; Remarque: exposer un dossier comme public est généralement considéré comme une solution peu intéressante. Mais peut être utile dans certaines situations.

J’ai rencontré quelque part cette bonne explication (je vais l’adapter à ce cas en cours):

C’est une mauvaise partie de la conception C #.

En interne, des éléments tels que robot2.Home sont implémentés en tant que propriétés. Ainsi, lorsque vous essayez d’atsortingbuer une valeur à Home.X , une fonction get pour Home est appelée sous le capot (et c’est là que ” Impossible de modifier la valeur de retour de .. ” va de). Lorsque cela est fait, vous ne pouvez pas affecter un membre individuel ( X ) de la structure Point , mais vous devez affecter la structure entière.

Donc, en C #, vous devez lire la valeur dans un Point , puis le modifier:

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

Ou (si nous ne sums pas intéressés par la valeur précédente (comme dans ce cas)), affectez-la simplement à la nouvelle:

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

PS: Bien sûr, vous devez également append un séparateur pour la propriété Home (comme il est mentionné dans d’autres réponses).

C’est une hypothèse, mais les propriétés X et Y ne sont probablement que des accesseurs, comme la propriété Your Home.

Existe-t-il une fonction dans votre classe de robot pour déplacer la position? Utiliser ça. si non donner un exemple complet s’il vous plaît