不能使用F#类型作为C#函数参数

时间:2014-03-02 12:06:18

标签: f#

我的F#库(相同的文件和命名空间)中有以下类型:

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&lt;相同HPart&GT; 。这是否意味着HFile不是一种类型?即使它只是一种语法糖,为什么我不能在我的概要中使用它,使代码更清晰,这也是我首先选择F#的原因之一。

1 个答案:

答案 0 :(得分:8)

问题是HFile是F#type abbreviation。在F#中,这意味着HFile类型与<{1}}完全相同。这意味着无论你在F#侧使用哪一个,你也可以使用另一个。

遗憾的是,类型缩写在.NET IL中没有任何直接表示,因此F#将它们编译为F#编译器理解的元数据。这意味着类型HPart list并不真正作为.NET和C#视图中的类型存在。

您可以将其定义为F#中的真实类型 - 例如使用单个构造函数的简单区分联合:

HFile

或者您可以在C#中使用type HFile = HFile of HPart list 定义C#样式的别名。这需要完整路径,并且必须位于您要使用的每个文件中using

HFile