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

Aur*_*het 0 f#

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

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

type HFile = HPart list
Run Code Online (Sandbox Code Playgroud)

这个库在C#项目中作为参考添加,我想创建一个以"HFile"作为参数的函数.

问题是以下概要不起作用:

public void LoadFromTemplate(HFile template)
Run Code Online (Sandbox Code Playgroud)

但这有效:

public void LoadFromTemplate(FSharpList<HPart> template)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第一个例子不起作用.当我开始编写时,Intellisense甚至不会在完成列表中显示"HFile".

我认为HFileFSharpList <HPart>相同.这是否意味着HFile不是一种类型?即使它只是一个语法糖,为什么我不能在我的概要中使用它,使代码更清晰,这是我首先选择F#的原因之一.

Tom*_*cek 9

问题是它HFile是F#类型的缩写.在F#中,这意味着该类型HFile完全相同的同样的事情HPart list.这意味着无论你在F#侧使用哪一个,你也可以使用另一个.

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

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

type HFile = HFile of HPart list
Run Code Online (Sandbox Code Playgroud)

或者您可以在C#中定义C#样式类型别名using.这需要完整路径,并且必须位于您要使用的每个文件中HFile:

using HFile = Microsoft.FSharp.FSharpList<YourFSharpNamespace.HPart>;
Run Code Online (Sandbox Code Playgroud)