从F#调用带有out参数的C#重载方法

6
我有以下的F#代码,用于处理一个Gtk.TreeView事件:
  tree.CursorChanged.Add(fun (e : EventArgs) -> 
      let selection = tree.Selection
      let mutable iter = new TreeIter ()
      if selection.GetSelected(&iter) then
        Console.WriteLine("Path of selected row = {0}", model.GetPath(iter))
      )

selection.GetSelected 有两个重载版本,其签名如下:

bool GetSelected(out TreeIter, out ITreeModel)

并且

bool GetSelected(out TreeIter)

这使得我无法使用描述在这篇文章中的返回元组版本:

let selection = tree.Selection
match selection.GetSelected() with
| true, iter -> // success
| _ -> // failure

有没有办法使用后一种语法来指定我想要的GetSelected重载?

编辑: 为了澄清问题,我知道我想要什么方法签名;我只是不知道如何指定它。例如,我尝试过这样做,但不起作用:

let f : (byref<TreeIter> -> bool) = selection.GetSelected
match f() with
| true, iter -> // success
| _ -> // failure

| true, iter, _ -> // success 怎么样? - ildjarn
无法解析方法分辨错误:在此程序点之前,无法基于类型信息确定方法“GetSelected”的唯一重载。可能需要使用类型注释。候选项:TreeSelection.GetSelected(iter:byref<TreeIter>):bool,TreeSelection.GetSelected(model:byref<ITreeModel>,iter:byref<TreeIter>):bool。 - Martin DeMello
错误信息没有给你所需的类型签名来应用于你想要的函数吗?TreeSelection.GetSelected(iter: byref<TreeIter>) : bool - Guy Coder
是的,但我不知道如何指定同时又获得F#魔法,即传递零个参数并将输出参数作为返回值的一部分返回。这就是我一开始问的问题 :) - Martin DeMello
1个回答

7

我认为

match selection.GetSelected() : bool*_ with
...

应该能够正常工作。


完美,谢谢!我应该意识到我需要指定F#签名,而不是C#签名。 - Martin DeMello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接