5

为什么 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像类范围内的其他字段一样初始化?例如:int a = 5。该字段onPointsPropertyChanged将在构造函数执行后始终使用。

4

3 回答 3

8

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

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

C# < 4有一个错误,在某些情况下允许这样做。

于 2013-06-10T18:25:36.713 回答
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;
    };
  }
}
于 2013-06-10T18:29:23.050 回答
-2

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

于 2013-06-10T18:31:13.107 回答