我正在尝试将此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;。 可能是我失踪的任务的基本问题。我做错了什么?
答案 0 :(得分:2)
据我所知,OnTouchesMoved
是Action<_, _>
类型的可变属性。通常,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#别名。