C# 在C中引用lambda事件处理程序中的非静态字段#

C# 在C中引用lambda事件处理程序中的非静态字段#,c#,lambda,event-handling,unity5,C#,Lambda,Event Handling,Unity5,我一直在Unity中开发一个基本游戏,并试图编写代码来检测球何时“停止”移动(即移动实际上为零)。我希望通过在位置更改事件处理程序内的多个帧上采样球位置之间的差异,通过eventargs传递两个移动之间的差异,来实现这一点 但是,每当我尝试访问locations数组时,就会出现以下错误:字段初始值设定项无法引用非静态字段、方法或属性“Ball.locations” 对于具体发生了什么,我有点困惑,因为我对事件处理程序相当陌生,并且承认复制了底部的lambda(因为它看起来更整洁),但没有真正理解

我一直在Unity中开发一个基本游戏,并试图编写代码来检测球何时“停止”移动(即移动实际上为零)。我希望通过在位置更改事件处理程序内的多个帧上采样球位置之间的差异,通过eventargs传递两个移动之间的差异,来实现这一点

但是,每当我尝试访问locations数组时,就会出现以下错误:
字段初始值设定项无法引用非静态字段、方法或属性“Ball.locations”

对于具体发生了什么,我有点困惑,因为我对事件处理程序相当陌生,并且承认复制了底部的lambda(因为它看起来更整洁),但没有真正理解它到底在做什么

以下是相关代码:

public class Ball : IBall {
    private float[] locations = new float[5];

    public Ball() {

    }

    public Vector3 Position {
        get { return position; }
        set {
            if (position != value) {
                BallMovedEventArgs eventArgs = new BallMovedEventArgs (position, value);
                position = value;
                OnMove (this, eventArgs);
            }
        }
    }

    public event EventHandler<BallMovedEventArgs> OnMove = (sender, e) => {
        // error is thrown here
        if(locations.Length > 5) {
            Debug.Log("Too many location deltas!");
        }
    };
}
公共类舞会:IBall{
私有浮动[]位置=新浮动[5];
公共舞会{
}
公共向量3位置{
获取{返回位置;}
设置{
如果(位置!=值){
BallMovedEventArgs eventArgs=新的BallMovedEventArgs(位置、值);
位置=值;
OnMove(这个,eventArgs);
}
}
}
公共事件事件处理程序OnMove=(发送方,e)=>{
//这里抛出错误
如果(位置。长度>5){
Log(“太多位置增量!”);
}
};
}

感谢您花时间阅读我的帖子,非常感谢您对理解这里发生的事情的任何帮助

无法在EventHandler中使用locations.length。您正在“同时”定义此事件处理程序和
位置
数组。似乎无论如何都不需要这样的陈述。5的长度是恒定的。

我通读了这个问题,不确定,但我只是查看了最佳答案底部的MSDN链接,我相信我现在明白了。在我的代码中,
OnPositionChanged
不是一个函数,而是一个类似于
locations
的变量,因为它们都是在“同一”时间声明的,所以它们不能相互依赖?而且,现在您指出,是的,比较完全没有意义。是的,是的。您可能需要类似于
索引的东西,它跟踪插入下一个位置的点。如果
索引
超出
位置的大小
>=5,则记录错误