C# 事件处理程序分配(在 CocosSharp 中),转换为 F#

C# event handler assignment (in CocosSharp), translation to F#

我正在尝试将此 C# 代码翻译成 F#,因为我正在学习 CocosSharp (http://developer.xamarin.com/guides/cross-platform/game_development/cocossharp/first_game/part3/)。 我在正确定义 HandleTouchesMoved 或将其分配给 touchListener 或两者都存在错误。

C#代码:

touchListener = new CCEventListenerTouchAllAtOnce ();
touchListener.OnTouchesMoved = HandleTouchesMoved;
AddEventListener (touchListener, this);

然后是 HandleTouchesMoved:

void HandleTouchesMoved (System.Collections.Generic.List touches, CCEvent touchEvent)
{
    //...
}

我的错误 F# 代码(只是 GameScene class 中的相关部分):

type GameScene (mainWindow: CCWindow) as x = 
    inherit CCScene (mainWindow)

    let touchListener = new CCEventListenerTouchAllAtOnce ()

    do
        // THIS IS WHERE THE PROBLEM HAPPEN
        touchListener.OnTouchesMoved <- x.HandleTouchesMoved
        x.AddEventListener (touchListener, x)

    member x.HandleTouchesMoved (touches: Collections.Generic.List<CCTouch>, touchEvent: CCEvent) =
        ()

对 OnTouchesMoved 的分配显然是错误的 - 它无法编译: "this function takes too many arguments, or is used in a context where a function is not expected"。 可能是我缺少的作业的基本问题。请问我做错了什么?

据我所知,OnTouchesMovedAction<_, _> 类型的可变 属性。通常,F# 函数与 Action 等 .NET 委托不同。现在,在某些上下文中,F# 允许您在需要委托的地方编写函数,但并非总是如此 - 所以我认为在这种情况下您需要更加明确。

我认为(未经测试)以下应该有效

touchListener.OnTouchesMoved <- Action<_,_>(fun t te ->
    x.HandleTouchesMoved(t, te))
x.AddEventListener(touchListener, x)

您也可以将 HandleTouchesMoved 定义为局部函数(而不是方法)并编写如下内容:

let handleTouchesMoved (touches:ResizeArray<CCTouch>, touchEvent: CCEvent) =
  ()

touchListener.OnTouchesMoved <- Action<_,_>(handleTouchesMoved)
x.AddEventListener(touchListener, x)

ResizeArray 名称是 .NET 通用可变列表类型的 F# 别名。