Creo que mucha gente se está confundiendo aquí, este problema en particular está relacionado con la comprensión de que las propiedades de tipo de valor devuelven una copia del tipo de valor (como con los métodos e indexadores), y se accede directamente a los campos de tipo de valor . El siguiente código hace exactamente lo que está tratando de lograr accediendo directamente al campo de respaldo de la propiedad (nota: expresar una propiedad en su forma detallada con un campo de respaldo es el equivalente de una propiedad automática, pero tiene la ventaja de que en nuestro código podemos acceder al campo de respaldo directamente):
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //succeeds
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
_origin.X = 10; //this works
//Origin.X = 10; // fails with CS1612;
}
}
El error que está obteniendo es una consecuencia indirecta de no entender que una propiedad devuelve una copia de un tipo de valor. Si se le devuelve una copia de un tipo de valor y no la asigna a una variable local, los cambios que realice en esa copia nunca podrán leerse y, por lo tanto, el compilador plantea esto como un error, ya que esto no puede ser intencional. Si asignamos la copia a una variable local, entonces podemos cambiar el valor de X, pero solo se cambiará en la copia local, que corrige el error de tiempo de compilación, pero no tendrá el efecto deseado de modificar la propiedad Origen. El siguiente código ilustra esto, ya que el error de compilación desapareció, pero la afirmación de depuración fallará:
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //throws error
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
var origin = Origin;
origin.X = 10; //this is only changing the value of the local copy
}
}