2017-07-29 60 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

請參閱編輯。 –

相關問題