无法修改返回值错误c#

我正在使用自动实现的属性。 我想最快的方法来解决以下是宣布我自己的支持variables?

public Point Origin { get; set; } Origin.X = 10; // fails with CS1612 

错误消息:无法修改“expression式”的返回值,因为它不是一个variables

试图修改作为中间expression式的结果的值types。 由于该值不是持久的,因此该值将保持不变。

要解决此错误,请将expression式的结果存储在中间值中,或者使用中间expression式的引用types。

这是因为Point是一个值types( struct )。

正因为如此,当你访问Origin属性时,你正在访问这个类所拥有的值的一个副本 ,而不是像引用types( class )那样的值本身,所以如果你设置了它的X属性,那么你在副本上设置属性,然后丢弃它,保持原始值不变。 这可能不是你想要的,这就是为什么编译器会警告你。

如果你想改变X值,你需要做这样的事情:

 Origin = new Point(10, Origin.Y); 

使用支持variables将无济于事。 Pointtypes是一个Valuetypes。

您需要将整个Point值分配给Origin属性: –

 Origin = new Point(10, Origin.Y); 

问题是当你访问Origin属性时, get返回的是Origin属性自动创build字段中Point结构的副本。 因此,您修改X字段的副本不会影响基础字段。 编译器检测到这一点,并给你一个错误,因为这个操作是完全无用的。

即使你使用自己的支持variables,你get像: –

 get { return myOrigin; } 

你仍然会返回一个Point结构的副本,你会得到同样的错误。

嗯…更仔细地阅读你的问题,或许你实际上是直接修改你的课堂上的支持variables:

 myOrigin.X = 10; 

是的,那将是你需要的。

现在你已经知道错误的来源是什么了。 如果一个构造函数不存在一个带你的属性的重载(在这个例子中是X ),你可以使用对象初始值设定项(它将在后台执行所有的魔术)。 不是说你不需要让你的结构不可改变 ,而只是给出额外的信息:

 struct Point { public int X { get; set; } public int Y { get; set; } } class MyClass { public Point Origin { get; set; } } MyClass c = new MyClass(); c.Origin.X = 23; //fails. //but you could do: c.Origin = new Point { X = 23, Y = c.Origin.Y }; //though you are invoking default constructor //instead of c.Origin = new Point(23, c.Origin.Y); //in case there is no constructor like this. 

这是可能的,因为幕后发生:

 Point tmp = new Point(); tmp.X = 23; tmp.Y = Origin.Y; c.Origin = tmp; 

这看起来像一个非常奇怪的事情,根本不build议。 只是列出一个替代方法。 更好的方法是使结构不可变,并提供一个适当的构造函数。

问题是你指向一个位于栈上的值,这个值不会被重新映射到orignal属性,所以C#不允许你返回一个值types的引用。 我认为你可以通过删除Origin属性来解决这个问题,而是使用一个公共提交,是的,我知道这不是一个好的解决scheme。 另一种解决scheme是不使用Point,而是创build自己的Pointtypes作为对象。

我想这里的catch是你正在试图在语句中分配对象的子值而不是分配对象本身。 在这种情况下,您需要指定整个Point对象,因为属性types是Point。

 Point newOrigin = new Point(10, 10); Origin = newOrigin; 

希望我在那里有道理