为什么C#lambda表达式不能使用实例属性和字段?

时间:2013-06-10 18:22:55

标签: c# lambda scope

为什么C#lambda表达式在类范围内使用时不能使用实例属性和字段?见这个例子:

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?对于instancie:int a = 5。始终在构造函数执行后使用字段onPointsPropertyChanged

3 个答案:

答案 0 :(得分:8)

在构造函数运行之前(例如在字段初始值设定项或基本构造函数调用中),无法访问对象实例。

在lambda内部和lambda外部都是如此。

C#< 4 had a bug在某些情况下允许这样做。

答案 1 :(得分:6)

  

字段初始值设定项不能引用非静态字段,方法或属性...

在执行构造函数之前执行字段初始值设定项。在执行构造函数之前,不允许引用任何字段或属性。

更改初始化以在类构造函数中设置lambda函数:

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

  PropertyChangedEventHandler onPointsPropertyChanged;

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

答案 2 :(得分:-2)

你指的是什么实例?在创建lambda表达式时,尚未创建任何实例;那么这些对X和Y的调用会被绑定到什么实例?