2017-07-29 86 views
4
let a = ref 0 
let f (x: byref<int>) = x 

f a // type error 

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

f a是因为a可以传递到.NET库方法与byref<int>类型的类型错误令人费解给我。为什么?为什么传递一个ref类型到一个F#函数中,期望得到一个byref类型错误?

编辑:我想我真的很不好地解释这个问题。 System.Int32.TryParse的类型是string * byref<int> -> bool,但它的工作原理。那么为什么我不能将a转换成x:byref<int> -> int类型的函数呢?这就是我所要求的。

+0

什么是确切的错误? – TheQuickBrownFox

+0

可能是https://stackoverflow.com/questions/5028377/understanding-byref-ref-and – rmunn

+0

错误FS0001的副本:预计此表达式的类型为'byref ',但这里的类型为'int ref' –

回答

5

该功能在F# spec的8.13.7节中描述。当期望byref时,使用ref的能力可通过“类型定向转换”启用,但这些仅适用于成员调用,而不适用于常规函数应用程序。

1

我看到错码的唯一事情是类型标注不正确,尝试代替byref<int>

的完整代码:int ref

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

+0

请参阅编辑。 –

相关问题