2014-03-02 65 views
0

我在我的F#庫中的下列類型(同一個文件&命名空間):無法使用F#類型C#函數參數

type HPart = 
| Titles of string list 
| HLine of string list 

type HFile = HPart list 

這個庫中添加作爲參考在C#項目,我想創建一個以「HFile」作爲參數的函數。

的問題是下面的簡介不起作用

public void LoadFromTemplate(HFile template) 

但這工作

public void LoadFromTemplate(FSharpList<HPart> template) 

我不明白爲什麼第一個例子不工作。當我開始編寫時,Intellisense甚至不會在完成列表中顯示「HFile」。

我想HFILE是一樣FSharpList < HPart>。這是否意味着HFile不是一種類型?即使它只是一個混合糖,爲什麼我不能在我的概要中使用它,使代碼更清晰,這也是我首先選擇F#的原因之一。

回答

6

問題是HFile是F#type abbreviation。在F#中,這意味着類型HFile完全相同HPart list相同。這意味着無論您在F#端使用哪一個,都可以使用另一個。

不幸的是,類型縮寫在.NET IL中沒有任何直接表示,因此F#將它們編譯爲F#編譯器所理解的元數據。這意味着類型HFile並不真正作爲.NET和C#視圖中的類型存在。

你可以把它定義爲在F#中一個真正的類型 - 例如,與單個構造一個簡單的區分聯合:

type HFile = HFile of HPart list 

或者你可以定義在C#中的C#風格類型別名與using。這需要完整的路徑,並且必須位於您要使用的每個文件中HFile

using HFile = Microsoft.FSharp.FSharpList<YourFSharpNamespace.HPart>;