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
类型的函数?这就是我要问的全部。
答案 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。