Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不能将F#类型用作C#函数参数_F# - Fatal编程技术网

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

不能将F#类型用作C#函数参数,f#,F#,我在我的F#库中得到了以下类型(相同的文件和名称空间): 这个库是作为C#项目中的引用添加的,我想创建一个以“HFile”为参数的函数 问题在于以下概要不起作用: public void LoadFromTemplate(HFile template) 但是这个起作用了: public void LoadFromTemplate(FSharpList<HPart> template) public void LoadFromTemplate(FSharpList模板) 我不明白

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

这个库是作为C#项目中的引用添加的,我想创建一个以“HFile”为参数的函数

问题在于以下概要不起作用:

public void LoadFromTemplate(HFile template)
但是这个起作用了

public void LoadFromTemplate(FSharpList<HPart> template)
public void LoadFromTemplate(FSharpList模板)
我不明白为什么第一个例子不起作用。当我开始编写Intellisense时,它甚至没有在完成列表中显示“HFile”


我认为HFile将与FSharpList相同。这是否意味着HFile不是一种类型?即使它只是一种合成糖,为什么我不能在我的概要中使用它,使代码更清晰,这也是我选择F#的原因之一。

问题是,
HFile
是一个F#。在F#中,这意味着类型
HFile
HPart list
完全相同。这意味着无论你在哪里使用F#侧的一个,你也可以使用另一个

遗憾的是,类型缩写在.NETIL中没有任何直接表示,因此F#编译它们就像F#编译器理解的元数据一样。这意味着类型
HFile
实际上并不作为.NET和C#视图中的类型存在

您可以在F#中将其定义为一个实类型,例如使用单个构造函数的简单区分并集:

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

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