La définition de la coordonnée Y de System.Windows.Point à partir d’une liste génère une erreur de modification.

J’ai quelques difficultés à définir la coordonnée Y d’un point lorsque j’accède au point à partir d’une liste.

Par exemple, cela fonctionne.

System.Windows.Point test = new System.Windows.Point(6,5); test.Y = 6; 

Cependant, si j’ai une liste de points et si j’accède à un point via la liste pour définir la coordonnée Y, je reçois une erreur.

 List bfunction = new List(); bfunction.Add(new System.Windows.Point(0, 1)); bfunction[0].Y = 6; 

La fonction b [0] est soulignée et me donne une erreur de “Impossible de modifier la valeur de retour de ‘System.Collections.Generic.List.this [int]’ car ce n’est pas une variable”.

Toute aide serait appréciée.

Le compilateur vous empêche fondamentalement de commettre une erreur. Lorsque vous accédez à la bfunction[0] , une copie du point sera bfunction[0] . Point est, malheureusement (IMO), une structure mutable. Donc, si le compilateur vous permettait de changer la copie, cette copie serait alors simplement jetée et la déclaration aurait été inutile. Au lieu de cela, vous devez utiliser une variable pour prendre la copie, la modifier ici, puis la replacer dans la liste:

 Point point = bfunction[0]; point.Y = 6; bfunction[0] = point; 

Cela ne serait pas nécessaire si Point était un type de référence et vous n’auriez pas eu la possibilité de commettre l’erreur si Point avait été un type de valeur immuable . Vous auriez toujours besoin d’extraire et de définir séparément, mais cela aurait ressemblé à quelque chose comme:

 bfunction[0] = bfunction[0].WithY(6); 

… où WithY aurait renvoyé une valeur en Point ayant la même valeur X que l’original, mais le Y spécifié.

J’ai eu le même problème, merci pour votre réponse.

voici ma solution:

 if (reset == false && run == true) { for ( int i = 0;i < locations.Count;i++) { double stepX = rnd.Next(-1, 2) * 5 * rnd.NextDouble(); double stepY = rnd.Next(-1, 2) * 5 * rnd.NextDouble(); double stepZ = rnd.Next(-1, 2) * 5 * rnd.NextDouble(); Vector3d transform = new Vector3d(stepX, stepY, stepZ); locations[i] += transform; // Constrain points to boundary conditions Point3d ptx = locations[i]; // make temp variable to hold all points ptx.X = CV.Constrain(ptx.X, 0, bX - 1); // access X coordinates and modify them locations[i] = ptx; // assign new X coordinates to points in List Point3d pty = locations[i]; pty.Y = CV.Constrain(pty.Y, 0, bY - 1); locations[i] = pty; Point3d ptz = locations[i]; ptz.Z = CV.Constrain(ptz.Z, 0, bZ - 1); locations[i] = ptz; Component.ExpireSolution(true); } }