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

このコードは完全に機能します。

同時に、これはコンパイルエラーを引き起こします(「変数ではないため、pの戻り値を変更できません」):

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


違いは何ですか?

4

1 に答える 1

7

あなたは邪悪な可変構造体を使用しています。

問題は、プロパティが元のフィールドへの参照ではなく、構造体のコピーを返すことです。したがって、変更はコピーされた構造体にのみ影響します。
いくつかの単純なケース(セッターを呼び出す)では、コンパイラーがミスをキャッチします。複雑なケース(構造体を変更するメソッドの呼び出し)では、コンパイラーはそれをキャッチせず、コードは黙って失敗します(つまり、コピーが変更され、元のコードは変更されません)。

回避策は使用していますp=new Point(x,y)

于 2010-11-27T15:17:46.990 に答える