2013-08-08 12 views
6

ich habe, ist eine Klasse BaseRobot genannt:Kann nicht den Rückgabewert geändert werden, da es keine Variable

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

Das ist, wo die ursprüngliche Heimat geschaffen, ich bin zu wollen, ein neues Zuhause in den program.cs erstellen. Ich habe den folgenden Code, aber es funktioniert nicht, es kommt mit einer Fehlermeldung

kommen Kann den Rückgabewert nicht ändern, da es keine Variable ist.

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

Wie ordnen Sie neue Werte x und Y?

+5

@MitchWheat und andere Leute. Das ist kein Duplikat, Sie sollten versuchen, beide Fragen zu lesen – musefan

+0

Was ist die Deklaration und der Namespace Ihres 'Points'? –

Antwort

2

Sie benötigen einen set Accessor zum Home Eigenschaft hinzuzufügen:

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

Das allein löst das Problem nicht – musefan

19

Sie müssen direkt die Home Eigenschaft setzen, in der Regel am besten ein neues Point Objekt zu erstellen ...

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

Um dies zu ermöglichen, müssen Sie außerdem einen set Accessor auf Ihre Home Eigenschaft anwenden ...

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

Wenn Sie mehr Informationen, warum der Compiler, um herauszufinden, wollen Sie nicht im Stich assignthe Wert direkt an die X Eigenschaft, überprüfen Sie dann ein paar der answers over here

+0

Ich habe dies getan, aber jetzt eine Nachricht im Hauptprogramm mit der Aussage 'Point' konnte nicht gefunden werden – user2657462

+0

@ user2657462: Dann haben Sie wahrscheinlich nicht den richtigen Namespace enthalten. Fügen Sie es entweder beim Erstellen des neuen Punktes hinzu (siehe meine Bearbeitung). Oder schließe sie am Anfang deiner Klassendatei ein: 'include System.Drawing;' (oder verwende "Resolve" in VS) – musefan

+1

Ja, das ist so offensichtlich, wenn du es zum zehnten Mal siehst. Jedenfalls +1. Habe ein weiteres Abzeichen für gute Antworten. – ouflak

2

System.Drawing.Point ein Werttyp ist, was bedeutet, dass Ihre Home Eigenschaft eine Kopie des privaten mHome zurückgibt, anstatt eine Referenz darauf.

Sie werden einen Setter für die Home-Eigenschaft hinzufügen müssen und stellen Sie Ihren Code:

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

Die passen Sie Ihre Telefonvorwahl einen neuen Punkt Startseite zuweisen:

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

Sie müssen Ihren Code wie folgt ändern:

private Point mHome; 

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

und legen sie es wie folgt aus:

Structs sind unveränderlich, so dass der Wert in der Tat neue Point Instanz zurückgibt, aber Ihre Eigenschaft keinen Setter haben.

+1

+1 für die Erwähnung, dass Strukturen unveränderlich sind. Wurde im oben gewählten Beitrag nicht erwähnt, was wichtig ist zu wissen, warum der Code im Eröffnungsbeitrag nicht funktioniert – Tseng

+2

Structs sind nicht unveränderbar, sie haben Wert Semantik. Sie können eine lokale Variable oder ein Feld eines Strukturtyps ändern, es sei denn, es wurde speziell so entworfen, dass es unveränderlich ist. –

0

Es ist wahrscheinlich, aber die Eigenschaft X und Y sind wahrscheinlich nur getters, wie Your Home Eigentum.

Gibt es eine Funktion in Ihrer Roboterklasse, um die Position zu verschieben? Verwende das.wenn nicht die volle Beispiel geben Sie bitte

+0

Vergiss nicht, dass wenn du nach der Veröffentlichung bemerkst, dass bereits eine andere Antwort (die besser oder die selbe ist) gepostet wurde, es keine Kosten für das Löschen deines Beitrags gibt, um Fragen mit Antworten zu vermeiden, die nichts hinzufügen. – Michelle

1

Neben der bereits erwähnten Lösung, die ein öffentliches Eigentum Setter zu machen, können Sie auch:

erstellen Setter-Methoden public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }

Expose das Feld als öffentliche public Point Home; Hinweis: Offenlegung eines Feldes als öffentlich wird in der Regel als keine nette Lösung betrachtet. Kann aber in manchen Situationen nützlich sein.

1

Ich habe irgendwo diese gute Erklärung trifft (ich es für diesen aktuellen Fall anpassen werden):

Es ist ein schlechter Teil des C# Designs.

Intern Sachen wie robot2.Home als Eigenschaften implementiert, so dass, wenn Sie einen Wert Home.X versuchen zuweisen, eine Get-Funktion für Home wird unter der Haube genannt (und das ist, wo "Kann nicht den Rückgabewert ändern .. "geht von). Wenn dies geschehen ist, können Sie nicht in ein einzelnes Mitglied (X) der Struktur Point zuweisen, sondern müssen die gesamte Struktur zuweisen.

Also in C#, müssen Sie den Wert aus in ein Point lesen und es dann ändern:

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

Oder (wenn wir in vorherigem Wert nicht interessiert zu tun (wie in diesem Fall)) weisen Sie einfach es neue:

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

PS: natürlich müssen Sie auch einen Setter für die Home Eigenschaft hinzufügen (wie in anderen Antworten erwähnt wird).

Verwandte Themen