2
class MyClas
{
   public System.Windows.Point p;
   public void f()
   {
      p.X = 0;
   }
}

此代码完美运行。

同时这会导致编译错误(“Cannot modify the return value of p, because it is not a variable”):

class MyClas
{
   public System.Windows.Point p {get; set;}
   public void f()
   {
      p.X = 0;
   }
}


有什么不同?

4

1 回答 1

7

您使用的是 evil 的可变结构

您的问题是属性返回结构的副本,而不是对原始字段的引用。所以你的修改只会影响复制的结构。
在一些简单的情况下(调用 setter),编译器会发现你的错误。在复杂的情况下(调用改变结构的方法)编译器不会捕获它,您的代码将默默地失败(即副本被修改而原始代码保持不变)。

解决方法是使用p=new Point(x,y)

于 2010-11-27T15:17:46.990 回答