为什么将ref类型传递给F#函数期望byref类型错误?

时间:2017-07-29 08:10:32

标签: f#

let a = ref 0
let f (x: byref<int>) = x

f a // type error

System.Int32.TryParse("123",a) // works

f a是一个类型错误令我感到困惑,因为a可以传递到byref<int>类型的.NET库方法。为什么呢?

编辑:我认为我真的很难解释这个问题。 System.Int32.TryParse的类型为string * byref<int> -> bool,但仍有效。那么为什么我不能将a传递给x:byref<int> -> int类型的函数?这就是我要问的全部。

2 个答案:

答案 0 :(得分:5)

F# spec的第8.13.7节描述了此功能。在期望ref时使用byref的能力由&#34;类型导向转换&#34;启用,但这些仅适用于成员调用,而不适用于常规功能应用程序。

答案 1 :(得分:1)

我认为该代码唯一错误是类型注释不正确,请尝试:int ref而不是byref<int>

完整代码:

let a = ref 0
let f (x: int ref) = x

f a // type error

System.Int32.TryParse("123",a) // works

编辑: 对不起,我误解了你的问题。所以这个对F#有点模糊,我认为F#需要稍微改进它的错误信息。发生的事情是因为C#最初没有元组,他们需要输出参数才能返回多个值。因此,当您看到像byref<int>这样的签名时,这就是.NET告诉您这是out参数的签名的方式,out参数仅适用于C#。更多阅读here