【问题标题】:Cannot use F# type as C# function parameter不能使用 F# 类型作为 C# 函数参数
【发布时间】:2014-03-02 22:33:42
【问题描述】:

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

【问题讨论】:

    标签: f#


    【解决方案1】:

    问题在于 HFile 是一个 F# type abbreviation。在 F# 中,这意味着HFile 类型与HPart list完全相同。这意味着无论您在 F# 端使用哪一个,都可以使用另一个。

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

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

    type HFile = HFile of HPart list
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多