Static F#:如何指定要使用的静态重载?

Static F#:如何指定要使用的静态重载?,static,f#,overloading,Static,F#,Overloading,我用C代码声明了两个类: 从C#调用B.TryParse没有问题,因为正确的重载由out参数类型决定,应该提前声明。由于out参数被转换成F#中的部分结果,我们得到了两个参数签名相同的函数。。。来自F#cause的调用无法根据此程序点之前的类型信息确定方法“TryParse”的唯一重载。可能需要类型批注。错误。我理解这个问题,甚至将TryParse声明为new。。。如果不是静态的 消息本身并不是很有帮助:它绝对不清楚什么样的注释以及在哪里添加 我怎么打这个电话? 最愚蠢的想法是重命名其中一个函数

我用C代码声明了两个类:

从C#调用
B.TryParse
没有问题,因为正确的重载由out参数类型决定,应该提前声明。由于out参数被转换成F#中的部分结果,我们得到了两个参数签名相同的函数。。。来自F#cause
的调用无法根据此程序点之前的类型信息确定方法“TryParse”的唯一重载。可能需要类型批注。
错误。我理解这个问题,甚至将
TryParse
声明为
new
。。。如果不是静态的

消息本身并不是很有帮助:它绝对不清楚什么样的注释以及在哪里添加

我怎么打这个电话?
最愚蠢的想法是重命名其中一个函数,但可能还有更聪明的方法吗?

您需要为传递给try方法的变量添加一个类型注释,在这种情况下是out变量,因为这是更改的内容。我认为这样做应该奏效:

let res, (b:B) = B.TryParse "MyString"
在F#中,类型注释位于标识符后面,前面是冒号(:)


(注意:in F#out参数可以从结果中恢复为元组)

有几种方法可以解决此问题:

  • 添加显式类型注释(如Robert所建议的)
  • 使用保存out参数返回值的变量作为以后某个函数调用的参数,该函数的参数“已知”为“B”类型;如果函数的参数被显式声明为类型“B”(通过添加显式类型注释),这通常效果最好
  • 创建一个内联帮助函数,该函数使用静态解析的泛型来调用所传递对象的TryParse方法

除了指定返回值的类型并让F#推断重载之外,还可以直接指定所需的重载,如下所示:
(Int32.TryParse:string->bool*int)“4”
let res, (b:B) = B.TryParse "MyString"