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

时间:2015-03-20 18:43:57

标签: f# c#-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)
{
    //...
}

MY FAULTY F#CODE(只是GameScene课程中的相关部分):

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的赋值显然有问题 - 它没有编译: &#34;此函数需要太多参数,或者在不期望函数的上下文中使用&#34;。 可能是我失踪的任务的基本问题。我做错了什么?

1 个答案:

答案 0 :(得分:2)

据我所知,OnTouchesMovedAction<_, _>类型的可变属性。通常,F#函数与.NET代理(如Action)不同。现在,在某些情况下,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#别名。