Impossible de modifier la valeur de retour, car il 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éé, je suis désireux de créer une nouvelle maison dans le program.cs
. J'ai le code suivant mais il ne fonctionne pas, il est venu avec un message d'erreur indiquant
Ne peut pas modifier la valeur de retour car il n'est pas une 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());
}
Comment affecter de nouvelles valeurs de x et de Y?
- et d'autres gars. Ce n'est pas un doublon, vous devriez essayer de lire à la fois les questions
- Qu'est-ce que la déclaration et l'espace de noms de votre
Point
?
Vous devez vous connecter pour publier un commentaire.
Vous devez définir la
Home
propriété directement, généralement préférable de créer un nouveauPoint
objet...Aussi, afin de permettre que vous devez appliquer une
set
accesseur pour votreHome
propriété...Si vous voulez en savoir plus d'informations de pourquoi le compilateur ne vous laisse pas assignthe valeur directement à la
X
de la propriété, puis vérifier quelques-uns des les réponses par iciPoint
(voir mon edit). Ou de l'inclure dans le haut de votre fichier de classe:include System.Drawing;
(ou de l'utilisation de "Résoudre" dans VS)Vous devez modifier votre code comme ceci:
et réglez comme ceci:
Les structures sont immuables de sorte qu'un changement de valeur en fait renvoie de nouvelles
Point
instance, mais votre propriété n'ont pas de setter.J'ai rencontré quelque part cette bonne explication (je vais l'adapter pour ce cas):
C'est une mauvaise partie de la C# design.
En interne, des trucs comme
robot2.Home
est mis en œuvre en tant que propriétés, de sorte que lorsque vous essayez d'affecter une valeur àHome.X
, une fonction pourHome
est appelé sous le capot (et c'est là que "Ne peut pas modifier la valeur de retour de .." va partir). Lorsque cela est fait, vous ne pouvez pas attribuer à un membre individuel (X
) de laPoint
struct, mais ont pour affecter l'ensemble de la structure.Donc, en C#, vous avez besoin de lire la valeur dans un
Point
et ensuite le modifier:Ou (si nous ne sommes pas intéressés à la valeur précédente (comme dans ce cas)) juste de l'attribuer à un nouveau:
PS: bien sûr, vous devez également ajouter une définition pour la Maison de la propriété (comme il est mentionné dans d'autres réponses).
Vous avez besoin d'ajouter un
set
accesseur pour leHome
propriété:System.Drawing.Point
est un type de valeur, ce qui signifie que votreHome
de la propriété est de retour une copie du privémHome
, plutôt que d'y faire référence.Vous aurez à ajouter une définition pour la Maison de la propriété et de l'ajuster à votre code:
Le régler votre code d'appel pour attribuer un nouveau point à la Maison:
Côté de la déjà mentionné solution pour se faire un public bien setter, vous pouvez également:
Créer des méthodes de définition
public void SetHomeX(double x) { mHome.X = x; }
public void SetHomeY(double y) { mHome.Y = y; }
Exposer le domaine public
public Point Home;
Remarque: exposer un dépôt public est généralement pas considéré comme une solution sympa. Mais peut être pratique dans certaines situations.
Son wil deviner , mais les biens X et Y sont probablement que des getters, comme Votre Maison propriété.
Est-il une fonction dans votre classe de robot pour déplacer la position?? L'utiliser. si pas de fournir de l'exemple complet veuillez