从C#调用F#函数

时间:2013-12-08 05:02:26

标签: c# visual-studio f#

我看过其他说明,但仍然不知道如何做到这一点。我有两个项目(C#中的Calculator和F#中的Logic)。我在计算器中添加了对Logic的引用,以及对FSharp.Core的引用

但是当我添加行

float result = Logic.start(formula);

在我的C#项目中,我收到错误消息:

  

“逻辑在当前上下文中不存在。”

逻辑项目中有一个模块逻辑,所以它应该显示正确吗?我还缺少什么?

编辑:这是功能定义......

let start formula =
core (List.ofSeq formula) [] []

1 个答案:

答案 0 :(得分:19)

你不能从C#中引用一个没有任何名称空间的F#模块。做这样的事情:

// F# project
namespace Some
module Logic =
    let start formula =
.....

或同等的

// F# project
module Some.Logic
let start formula =
.....

// C# project
.....
Some.Logic.start(formula)

并从C#项目引用F#项目。

更新:正如JackP指出的那样,另一种替代方案存在,允许完全避免在F#端使用显式名称空间。

在C#中,您可以在任何命名空间之外创建一个类,可以通过在global上下文关键字后跟::运算符前面添加其名称来引用该类,这是引用{{3}的方式}。从参考角度看,在任何命名空间之外具有简单名称的F#模块等同于在第一行代码中具有default top-level .NET namespace的模块。将此考虑因素应用于您的案例,您可以选择:

// F# definition
// namespace global is assumed
module Logic
let start formula =
.....

// C# reference
...global::Logic.start(formula)...

namespace globalglobal::提供有关{{1}}的详细信息。