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

C#事件处理程序赋值(在CocosSharp中),转换为F#,f#,c#-to-f#,F#,C# To F#,我在学习CocosSharp()时,正在尝试将这个C代码翻译成F代码。 我在正确定义HandleTouchesMoved或将其分配给touchListener或两者都有错误 C#代码: touchlister=new-cceventlistenertouchallatonice(); touchListener.ontouchsmoved=handletouchsmoved; AddEventListener(touchListener,this); 然后HandleTouchesMoved:

我在学习CocosSharp()时,正在尝试将这个C代码翻译成F代码。 我在正确定义HandleTouchesMoved或将其分配给touchListener或两者都有错误

C#代码:

touchlister=new-cceventlistenertouchallatonice();
touchListener.ontouchsmoved=handletouchsmoved;
AddEventListener(touchListener,this);
然后HandleTouchesMoved:

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

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

将游戏场景(主窗口:CCWindow)键入为x=
继承场景(主窗口)
让touchListener=new-CCEventListenerTouchAllAtOnce()
做
//这就是问题所在

就我所见,
OnTouchesMoved
是类型为
Action
的可变属性。一般来说,F#函数与.NET委托不同,如
操作
。现在,在某些上下文中,F#允许您在需要委托的情况下编写函数,但并不总是这样-因此我认为在这种情况下,您需要更加明确

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

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

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

问题本身在哪里?你带了三行C,一些是F。你认为给出你想听的答案就足够了?你为什么用“做”这个词?对不起,我的英语太差了。问题的末尾加了一行。声明它在赋值时未编译。这也是您在代码本身中看到的注释,do()是类构造函数的一部分。如果你认为我错了,请纠正我。我是来学习的。谢谢。您遇到了什么编译器错误?“此函数包含太多参数,或者在不需要函数的上下文中使用”。显然,这是作业中的一个非常基本的问题。它很有效!虽然说实话,我不确定我是否真的理解明确定义动作的必要性,或者为什么没有
fun
本地函数可以工作,并且成员必须使用它。。。非常感谢你回答托马斯的问题!我是一个超级粉丝:)并且对这本新书很感兴趣。它甚至在TIOBE指数上被提及,作为本月F#排在第11位的可能原因。谢谢!为了添加更多信息,本地函数的工作毫无乐趣,因为它将参数定义为空格分隔(curried form),而成员使用一个元组参数。您也可以用空格定义成员,但这不是常见的做法。谢谢您的澄清。我总是对元组成员签名与局部函数签名的区别感到非常困惑,即使定义是相同的(文本方面的!)。我有很多东西要学。。。谢谢!将代码作为F#(部分)翻译添加到GitHub中,以用于CocosSharp“BouncingBall”C#教程。
touchListener.OnTouchesMoved <- Action<_,_>(fun t te ->
    x.HandleTouchesMoved(t, te))
x.AddEventListener(touchListener, x)
let handleTouchesMoved (touches:ResizeArray<CCTouch>, touchEvent: CCEvent) =
  ()

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