5

クラススコープで使用されている場合、C#ラムダ式がインスタンスプロパティとフィールドを使用できないのはなぜですか? 次の例を参照してください。

public class Point:INotifyPropertyChanged
{
    public float X {get; set;}
    public float Y {get; set;}

    PropertyChangedEventHandler onPointsPropertyChanged =  (_, e)  =>
                               {
                                   X = 5;
                                   Y = 5; //Trying to access instace properties, but a compilation error occurs
                               };
    ...
}

なぜこれが許可されていないのですか?

編集

できれば:

public class Point:INotifyPropertyChanged
{
    public float X {get; set;}
    public float Y {get; set;}

    PropertyChangedEventHandler onPointsPropertyChanged; 
    public Point()
    {
        onPointsPropertyChanged =  (_, e)  =>
                               {
                                   X = 5;
                                   Y = 5;    
                               };
    }
    ...
}

onPointsPropertyChangedクラス スコープ内の他のフィールドのように初期化できないのはなぜですかint a = 5? フィールドonPointsPropertyChangedは、コンストラクターの実行後に常に使用されます。

4

3 に答える 3

6

フィールド初期化子は、非静的フィールド、メソッド、またはプロパティを参照できません...

フィールド初期化子は、コンストラクターが実行される前に実行されます。コンストラクターが実行される前に、フィールドまたはプロパティを参照することは許可されていません。

初期化を変更して、クラス コンストラクターでラムダ関数を設定します。

public class Point : INotifyPropertyChanged
{
  public float X { get; set; }
  public float Y { get; set; }

  PropertyChangedEventHandler onPointsPropertyChanged;

  public Point()
  {
    onPointsPropertyChanged = (_, e) =>
    {
      X = 5;
      Y = 5;
    };
  }
}
于 2013-06-10T18:29:23.050 に答える
-2

どのような事例を指していますか? ラムダ式を作成している時点では、インスタンスはまだ作成されていません。では、これらの X と Y への呼び出しはどのインスタンスにバインドされるのでしょうか?

于 2013-06-10T18:31:13.107 に答える